新闻中心> 文章详情

怎样调整Linux结构及内存分配

2015年09月08日

  Linux系统和微软系统还是有区别的,学过Linux培训的人可能会熟悉一些,对于大家来说或许有些复杂,如果不清楚大家可以参考一些下面的说明:


  结构体定义:


  structa{


  intxx:4;


  intyy:4;


  };


  结构体初始化:


  方式一:


  structaaa={


  xx:2,


  yy:3


  };


  方式二:


  structacc={


  .xx=6,


  .yy=1,


  };


  方式三:


  structadd={4,2};


  在定义中,可以限制变量的位的作用域,比如上面的:intxx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning:overflowinimplicitconstantconversion。南京RHCE认证培训


  在这里如果你给xx赋值为15,如:


  structacc={


  .xx=15,


  .yy=1,


  };


  然后输出:


  printf("cc.xx=%d\n",cc.xx);


  结果会是:-1


  因为这里定义的xx为int型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。


  这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。南京RHCE认证培训


  引出的其他问题


  这里用sizeof(structa)得到的是4,如果不加位域限制则是8,至于为什么是4呢?4bit+4bit应该刚好是1byte啊,应该是1才对啊。这是因为我是在linux下编译执行的,而在linux对内存分配最小值为类型值的一半。(我在linux下做了实验)如下我定义了一个结构体:


  structa{


  shortintxx:2;


  shortintyy:2;


  }bb;


  如上,我定义二个shortint类型值,shortint在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(structa)的值为2。不足一字节系统自动补满一字节。


  structa{


  shortintxx:9;


  shortintyy:2;


  }bb;


  这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。南京RHCE认证培训


  structa{


  shortintxx:9;


  shortintyy:9;


  }bb;


  这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。


上一篇下一篇
按时发顺丰

技术交流群

Java大数据交流群560819979    加入
Python技术交流群595083299    加入
Oracle技术交流群595119011    加入
Web前端技术交流群604697610    加入
Huawei技术交流群482919361    加入
Redhat技术交流群587875348    加入
UI设计技术交流群511649801    加入
Cisco技术交流群596886705    加入
IT运维技术交流群605888381    加入