C++ 为什么结构和联合体之间存在尺寸不匹配?
我已经声明了一个将4100字节分配给变量“sample_union”的联合,并作为分配4104字节的结构的一部分进行了相同的联合声明C++ 为什么结构和联合体之间存在尺寸不匹配?,c++,c,linux,gcc,C++,C,Linux,Gcc,我已经声明了一个将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_va
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 ;
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;
将上述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 ;
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当您将联合体放在结构中时,您没有将联合体标记为已打包。未打包的联合有一点填充(四个字节),因此它的大小是
uint64\u t
大小的倍数
压缩接头没有这种衬垫,所以它更小
作为旁白,联合体内部的匿名结构没有标记为
packed
。在这种情况下,这并不重要,因为所有的东西都是很好地对齐的,但是它是需要注意的。注意到C++结构不允许匿名结构(GCC确实提供它作为扩展)。所以在大多数机器上占用4096字节。@user50不在注释中发布多行代码;换言之,我的原话是:工会内部的结构没有打包。实际上,打包工会在这种情况下是有意义的。未打包的联合具有一些填充,因此其大小是8的倍数(sizeof(uint64_t))。拥挤的工会没有。