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?
为什么这个结构的
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 |
对齐很好,因为未对齐的结构需要为许多架构做额外的工作。
结构中的各个字段需要适当地对齐。编译器将在结构中填充额外的空间,以满足对齐要求。
如果不想这样做,可以使用
我认为编译器对字段使用了4字节的联合。
这个问题是因为一个被称为"对齐"的概念。在许多情况下,希望将数字放在一个地址上,该地址是数字大小的倍数(字节)(达到某个最大值,通常是平台的指针大小)。这样放置的变量被称为与n字节边界对齐,其中n是数字。具体效果取决于处理器。如果数据正确对齐,许多处理器可以更快地执行数学运算。有些甚至不能对不合适的对齐数据执行操作(有时甚至是加载操作),为了处理这些数据,必须将其加载到两个寄存器中,然后需要执行一系列的位移位和屏蔽以获得可用值,然后需要将其放回。把它想象成把一半的
在您的情况下,最初的
然而,当在同一个系统上编译时,填充可能是一致的,这可能取决于编译器选项和所使用的特定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以避免填充
这是由于对齐-编译器必须做一些填充。
由于内存的分配方式,短时间后会有填充