我已经声明了一个联合分配4100个字节到变量" sample_union"并将相同的union声明作为分配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 ;
将上面的union放在结构内部分配4104个字节。
struct test_size_struct {
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_struct;
嗯,这不是项目要求,但我想知道为什么编译器对这两个声明的行为不同。
gcc版本:(GCC)4.9.2,x86_64
平台:Linux,x86_64
答案 0 :(得分:11)
当您将联合放置在结构中时,您没有将联合标记为packed
。解压缩的联合有一个小填充(四个字节),因此它的大小是uint64_t
大小的倍数。
打包的联合没有这个填充,所以它更小。
作为侧面观察,联合中的匿名结构未标记为packed
。在这种情况下,这种情况并不重要,因为无论如何一切都很好地对齐 - 但它需要注意的事情。