为什么这个结构体的sizeof();
是16字节?我正在使用g++编译。
struct bitmapfileheader {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
};
为什么这个结构体的sizeof();
是16字节?我正在使用g++编译。
struct bitmapfileheader {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
};
这是因为4字节的int类型需要对齐到4字节边界,所以在bfType后面会有2字节的填充。
对齐。 在您的平台上,整数需要4字节对齐,而短整型需要2字节对齐。
+0 -1 : bfType
+2 -3 : <padding>
+4 -7: bfSize
+8 -9: bfReserve1
+10 -11: bfReserve2
+12 -15: bfOffBits
-------------
16 bytes
对齐是很重要的,因为未对齐的结构在许多架构中需要额外的工作。
结构体中的各个字段需要适当对齐。编译器会在结构体中填充额外的空间,以满足对齐要求。
如果您不想这样做,可以使用UNALIGNED
宏。
__unaligned
是Visual C++的扩展,并不被例如g++支持(问题明确标识为所使用的实现)。任何这样的宏都将固有地与实现相关。 - Pavel MinaevISO C++03,9.2[class.mem]/12:
非联合类的非静态数据成员在声明时没有中间访问说明符的情况下分配,以便稍后的成员在类对象内具有更高的地址。通过访问说明符分隔的非静态数据成员的分配顺序是未指定的(11.1)。实现对齐要求可能导致两个相邻的成员不会立即相互分配;因此,管理虚函数(10.3)和虚基类(10.1)所需的空间的要求也可能如此。