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