2016-04-14 60 views
10

我已经声明了一个联合分配变量“sample_union”4100字节,并作为分配4104个字节的结构的一部分作出相同的联合声明。为什么结构和工会之间的尺寸不匹配?

union test_size_union { 
    struct { 
     uint8_t type; 
     union { 
      uint8_t count; 
      uint8_t list; 
     }; 
     uint16_t rc; 
     uint16_t arr_value[2048]; 
    }; 
    uint64_t first_dword; 
}__attribute__((packed)) sample_union ; 

将上面的联合放在结构内部分配4104字节。嗯,这不是项目需求,但我想知道为什么编译器在这两个声明中表现不同。

gcc版本:(GCC)4.9.2,x86_64的

平台:Linux,x86_64的

+0

请注意,C++标准不允许使用匿名结构(GCC确实将它作为扩展提供)。 – user2079303

+0

这主要功能: int main(void) { printf(“sample_union =%d \ n”的大小,sizeof(sample_union)); (“sample_struct的大小=%d \ n”,sizeof(sample_struct)); return 0; } 输出:sample_union的 大小= 4100 大小sample_struct = 4104 – user50

+1

@JoachimPileborg的:该数组是类型的'uint16_t [2048]',所以占用了在大多数机器4096个字节。 – DarkDust

回答

11

当你放在里面结构的结合,你没有标注工会packed。解压后的union有一个小填充(四个字节),所以它的大小是uint64_t大小的倍数。

包装联合不具备此填充,因此它更小。

作为一个侧面观察,联盟内部的匿名结构未标记为packed。这种情况在这种情况下并不重要,因为无论如何,一切都很好地对齐 - 但这是需要注意的事情。