Sizeof 运算符返回不正确的大小?

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特权,我如何确保结构的所有字段占用我希望它们占用的数量(我正在向这个结构投射一堆字节)?

MBy*_*ByD 5

编译器可能会在结构中间附加一些字节以对齐结构成员。struct 的大小至少是成员大小的总和,但不限于此。

  • @Nick 请注意,使用`packed` *可能* 会影响程序的性能。未对齐的内存访问可能比对齐的访问更昂贵,并且可以在循环中产生可测量的差异。 (4认同)