对于以下结构,结构的实际(没有填充)大小为54.在具有MinGW(GCC)4.8.1 x86_64的64位(Windows 7)计算机上,I得到sizeof(BMPHeader)
为56,这是可以理解的。根据BMP文件格式的要求,结构应该没有填充。我有三个选项(优先订购):
alignas(1)
struct __attribute__ ((packed)) BMPHeader
#pragma pack(1)
然而,单独的最后一个选项(具有最低优先级)似乎可以给我54.这是编译器中的错误还是我在这里完全误解了一些东西? SSCCE
#include <iostream>
struct alignas(1) BMPHeader
{
// BMP header
uint16_t magic;
uint32_t fileSize;
uint32_t reserved;
uint32_t dataOffset;
// DIB header
uint32_t dibHeaderLength;
uint32_t width;
uint32_t height;
uint16_t numColourPlanes;
uint16_t bitsPerPixels;
uint32_t biBitFields;
uint32_t dataSize;
uint32_t physicalWidth;
uint32_t physicalHeight;
uint32_t numPaletteColours;
uint32_t numImportantColours;
};
int main()
{
std::cout << sizeof(BMPHeader) << std::endl;
}
答案 0 :(得分:3)
alignas
不能用于这种情况,因为我们要求的对齐不如结构的自然对齐更严格。这在 dcl.align 标准中指定(强调相关部分):如果为实体指定了多个alignment-specifiers,则对齐要求应设置为最严格的指定对齐。
声明中所有alignment-specifiers的组合效果不应指定比如果省略所有alignment-specifiers所声明的实体所需的对齐更严格的对齐(包括其他声明中的那些。)
由BMPHeader
返回的alignof(BMPHeader)
的对齐方式为4
,因此任何对齐方式都不会比不会更加严格(不太宽)。
__attribute__ ((packed))
肯定是正确的方法。但是,使用GCC时,由于bug in MinGW和works fine,这不起作用。
因此,目前MinGW唯一的方法就是使用#pragma pack(1)
。有关此方法的详细信息,请参阅#pragma pack effect。