C++结构大小:2 + 4 + 2 + 2 + 4 = 16

Luk*_*kas 3 c++ sizeof structure-packing

可能重复:
为什么structof sizeof不等于每个成员的sizeof之和?

为什么sizeof();这个结构有16个字节?我正在用g ++编译.

struct bitmapfileheader {       
     unsigned short bfType;
     unsigned int bfSize;
     unsigned short bfReserved1;
     unsigned short bfReserved2;
     unsigned int bfOffBits;   
   };
Run Code Online (Sandbox Code Playgroud)

Ram*_*ter 12

这是因为4字节整数与4字节边界对齐,因此在bfType之后有2个字节的填充.


San*_*a R 8

对准. 可能在你的平台上整数必须是4字节对齐,短裤是2字节对齐.

+0 -1 : bfType
+2 -3 : <padding>
+4 -7: bfSize
+8 -9: bfReserve1
+10 -11: bfReserve2
+12 -15: bfOffBits
-------------
16 bytes
Run Code Online (Sandbox Code Playgroud)

对齐是好的,因为未对齐的结构需要许多架构的额外工作.


Ano*_*on. 7

结构中的各个字段需要适当对齐.编译器将填充结构中的额外空间以满足对齐要求.

如果您不想这样,可以使用UNALIGNED宏.

  • 我不认为`unaligned`是一个关键字.那将是编译器特定的. (6认同)
  • 在GCC中,您可以使用__attribute __((packed)); 表示您要取消对齐字段.例如:unsigned short bfType __attribute __((packed)); (2认同)
  • `__unaligned`是Visual C++扩展,并且不受例如g ++(该问题明确标识为正在使用的实现)的支持.任何这样的宏本质上都是特定于实现的. (2认同)

And*_*gin 5

我认为你的编译器使用4字节的对齐字段.