我已经声明了一个 union ,将 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
最佳答案
当您将 union 置于结构中时,您并未将 union 标记为已打包
。解压缩的 union 有一点填充(四个字节),因此它的大小是 uint64_t
大小的倍数。
packed union 没有这个填充,所以它更小。
作为侧面观察, union 内的匿名结构未标记为packed
。在这种情况下,这恰好无关紧要,因为无论如何一切都很好地对齐 - 但这是需要注意的事情。
关于c++ - 为什么结构和 union 之间存在大小不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36620780/