Kri*_*oks 2 c struct x86-64 structure-packing
可能的重复:
为什么结构的 sizeof 不等于每个成员的 sizeof 之和?
将结构的成员声明为 uint32_t 时的额外字节
出于某种原因,sizeof运算符返回此结构的虚假大小(48而不是40):
typedef struct mbdb_file_info {
uint16_t mode;
uint32_t unk0;
uint32_t unk1;
uint32_t user_id;
uint32_t group_id;
uint32_t time0;
uint32_t time1;
uint32_t time2;
uint64_t length;
uint8_t flag;
uint8_t property_count;
} mbdb_file_info;
Run Code Online (Sandbox Code Playgroud)
所以这是一个简单的测试:
printf("%ld %ld %ld %ld: %ld", sizeof(uint8_t),
sizeof(uint16_t),
sizeof(uint32_t),
sizeof(uint64_t),
sizeof(mbdb_file_info));
Run Code Online (Sandbox Code Playgroud)
哪个打印:
1 2 4 8: 48
这是怎么发生的?如果你把所有的尺寸加在一起,你会得到40,而不是48。到底是48从哪里来的?
如果这是一些奇怪的x86-64特权,我如何确保结构的所有字段占用我希望它们占用的数量(我正在向这个结构投射一堆字节)?
编译器可能会在结构中间附加一些字节以对齐结构成员。struct 的大小至少是成员大小的总和,但不限于此。