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

Structure padding for byte alignment - specific example

我正在阅读麻省理工学院开放式课件的讲义,内容是关于结构填充的 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个字节的padding?

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