为什么'sizeof'会给错误的测量?

jon*_*ham 5 c++ struct sizeof

可能重复:
结果大小不符合结果

我有这个C++结构:

struct bmp_header {

  //bitmap file header (14 bytes)
  char Sign1,Sign2; //2
  unsigned int File_Size; //4
  unsigned int Reserved_Dword; //4
  unsigned int Data_Offset; //4

  //bitmap info header (16 bytes)
  unsigned int Dib_Info_Size; //4
  unsigned int Image_Width; //4
  unsigned int Image_Height; //4

  unsigned short Planes; //2
  unsigned short Bits; //2  
};
Run Code Online (Sandbox Code Playgroud)

它应该是30个字节,但'sizeof(bmp_header)'给我值32.什么错了?

Gre*_*osz 9

它没有给出错误的测量结果.您需要了解对齐和填充.

编译器可以在结构成员之间添加填充以遵守对齐约束.也就是说,可以使用编译器特定的指令来控制填充(请参阅GCC变量属性MSVC++编译指示).


Dan*_*iel 6

原因是因为填充.如果你把chars放在结构的末尾,sizeof可能会给你30个字节.整数通常存储在4的倍数的存储器地址中.因此,由于字符占用2个字节,因此它与第一个unsigned int之间有两个未使用的字节. char不像int,通常不会填充.

一般来说,如果空间是一个大问题,请始终订购structs从最大到最小的元素.

请注意,填充并不总是(或通常)sizeof(element).这是巧合,int在4个字节char上对齐并在1个字节上对齐.