使用C++11进行MinGW和压缩结构对齐

使用C++11进行MinGW和压缩结构对齐,c++11,struct,g++,mingw,memory-alignment,C++11,Struct,G++,Mingw,Memory Alignment,对于下面的结构,结构的实际无填充大小为54。在带有MinGW GCC 4.8.1 x86_64的64位Windows 7机器上,我得到的SizeOfBMHeader为56,这是可以理解的。根据BMP文件格式的要求,结构应该没有填充。我有三个优先顺序选项: C++11的alignas1 结构\uuuuu属性\uuuuu压缩BMPHeader 布拉格pack1 然而,仅最后一个优先级最低的选项似乎就能让我得到54分。这是编译器中的错误还是我完全弄错了?SSCCE #include <iostr

对于下面的结构,结构的实际无填充大小为54。在带有MinGW GCC 4.8.1 x86_64的64位Windows 7机器上,我得到的SizeOfBMHeader为56,这是可以理解的。根据BMP文件格式的要求,结构应该没有填充。我有三个优先顺序选项:

C++11的alignas1 结构\uuuuu属性\uuuuu压缩BMPHeader 布拉格pack1 然而,仅最后一个优先级最低的选项似乎就能让我得到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;
}
正如Martinho所指出的,alignas不能在这种情况下使用,因为我们要求的对齐比结构的自然对齐更为严格。这在dcl下的标准中有规定。相关部分强调: 当为一个实体指定了多个对齐说明符时,对齐要求应设置为最严格的指定对齐

如果省略了所有对齐说明符(包括其他声明中的对齐说明符),则声明中所有对齐说明符的组合效果不得指定比被声明实体所需对齐要求更严格的对齐

AlignOfBMHeader返回的BMP阅读器的校准为4,因此,任何比该校准更严格、更宽的校准都不会被接受

__当使用GCC作为使结构紧密打包的方法时,属性_uuu-packed无疑是正确的方法。但是,这不起作用,因为在使用GCC时会出现错误

因此,目前在MinGW中唯一的方法就是使用pragma pack1。有关此方法的更多详细信息,请参阅

正如Martinho所指出的,alignas不能在这种情况下使用,因为我们要求的对齐比结构的自然对齐更为严格。这在dcl下的标准中有规定。相关部分强调: 当为一个实体指定了多个对齐说明符时,对齐要求应设置为最严格的指定对齐

如果省略了所有对齐说明符(包括其他声明中的对齐说明符),则声明中所有对齐说明符的组合效果不得指定比被声明实体所需对齐要求更严格的对齐

AlignOfBMHeader返回的BMP阅读器的校准为4,因此,任何比该校准更严格、更宽的校准都不会被接受

__当使用GCC作为使结构紧密打包的方法时,属性_uuu-packed无疑是正确的方法。但是,这不起作用,因为在使用GCC时会出现错误

因此,目前在MinGW中唯一的方法就是使用pragma pack1。有关此方法的更多详细信息,请参阅

alignas1不起作用。使用此选项,您无法请求比自然路线更严格的路线。alignas1不起作用。这样,您就不能要求比自然路线更严格的路线。