关于sizeof:C ++ struct size:2 + 4 + 2 + 2 + 4 = 16

C++ struct size: 2+4+2+2+4 = 16

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why isn’t sizeof for a struct equal to the sum of sizeof of each member?

为什么这个结构的sizeof();是16字节?我正在用G++编译。

1
2
3
4
5
6
7
struct bitmapfileheader {      
     unsigned short bfType;
     unsigned int bfSize;
     unsigned short bfReserved1;
     unsigned short bfReserved2;
     unsigned int bfOffBits;  
   };


这是因为4字节整数与4字节边界对齐,所以bftype后面有2个字节的填充。


对准。很可能在您的平台上,ints必须是4字节对齐的,而short必须是2字节对齐的。

1
2
3
4
5
6
7
8
+0 -1 : bfType
+2 -3 : <padding>
+4 -7: bfSize
+8 -9: bfReserve1
+10 -11: bfReserve2
+12 -15: bfOffBits
-------------
16 bytes

对齐很好,因为未对齐的结构需要为许多架构做额外的工作。


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

如果不想这样做,可以使用UNALIGNED宏。


我认为编译器对字段使用了4字节的联合。


这个问题是因为一个被称为"对齐"的概念。在许多情况下,希望将数字放在一个地址上,该地址是数字大小的倍数(字节)(达到某个最大值,通常是平台的指针大小)。这样放置的变量被称为与n字节边界对齐,其中n是数字。具体效果取决于处理器。如果数据正确对齐,许多处理器可以更快地执行数学运算。有些甚至不能对不合适的对齐数据执行操作(有时甚至是加载操作),为了处理这些数据,必须将其加载到两个寄存器中,然后需要执行一系列的位移位和屏蔽以获得可用值,然后需要将其放回。把它想象成把一半的int存储在两个桶中的每一个桶中,需要把它们放在一起才能使用它,而不是简单地把整个int存储在一个桶中。

在您的情况下,最初的bfType可能需要与2字节边界对齐,而bfSize可能需要与4字节边界对齐。编译器必须通过将整个结构对齐到4个字节,并在bfTypebfSize之间保留2个未使用的字节来解决这一问题。

然而,当在同一个系统上编译时,填充可能是一致的,这可能取决于编译器选项和所使用的特定ABI(通常情况下,在同一个平台上是安全的,除非您试图使事情不兼容)。您可以自由地使用相同的前5个成员生成另一个结构,它们将在完全相同的位置上占用另一个结构的16个字节。

如果您真的需要避免这种行为,您必须检查编译器文档。大多数编译器都提供一个属性或关键字来声明变量没有对齐,另一个属性或关键字指示结构不应该有填充。但在一般情况下,这些都是不必要的。


ISO C++ 03,9.2 [类,MEM] / 12:

Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated so that later members have higher addresses within a class object. The order of allocation of nonstatic data members separated by an access-specifier is unspecified (11.1). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).


u可以对结构进行pragma pack以避免填充


这是由于对齐-编译器必须做一些填充。


由于内存的分配方式,短时间后会有填充