字节对齐的结构填充 - 具体示例

时间:2015-01-06 22:53:02

标签: data-structures padding memory-alignment

我正在阅读麻省理工学院开放式课件的讲义,关于C语言中关于结构填充的实用编程:

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-087-practical-programming-in-c-january-iap-2010/lecture-notes/MIT6_087IAP10_lec07.pdf

在其中,我理解为什么以下结构的大小为16:

struct foo { 
   short s;             
   union {
     int i;
     char c;
   }u;      
   unsigned int flag_s : 1;
   unsigned int flag_u : 2;
   unsigned int bar;
}

为了最小化结构的大小,作者将字段从最大到最小重新排列:

struct foo {              
   union {
      int i;
      char c;
   }u;   
   unsigned int bar;    
   short s;
   unsigned int flag_s : 1;
   unsigned int flag_u : 2;
}

并且作者说结构的大小现在应该是12.但是,在我的Windows 32位机器上,我仍然得到结构大小为16的输出。那是为什么?

只有当我移动位字段下面的'short s'字段时,才会得到结构大小为12.这是因为位字段必须以4字节边界开始,因为它是无符号整数吗?因此,在上面的结构中,'short s'字段后仍然会有2个字节的填充?

1 个答案:

答案 0 :(得分:0)

根据C语言标准,位字段布局是实现依赖。所以这个结构的大小在作者的机器上是12个字节是很好的,但是它在你的机器上是16个(但是,很奇怪,在演讲中他们声称它的大小是12个字节而没有指出它是编译器依赖的)