MinGW和使用C ++ 11的打包结构对齐

时间:2013-11-22 11:44:54

标签: c++11 struct g++ mingw memory-alignment

对于以下结构,结构的实际(没有填充)大小为54.在具有MinGW(GCC)4.8.1 x86_64的64位(Windows 7)计算机上,I得到sizeof(BMPHeader)为56,这是可以理解的。根据BMP文件格式的要求,结构应该没有填充。我有三个选项(优先订购):

  1. C ++ 11的alignas(1)
  2. struct __attribute__ ((packed)) BMPHeader
  3. #pragma pack(1)
  4. 然而,单独的最后一个选项(具有最低优先级)似乎可以给我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;
    }
    

1 个答案:

答案 0 :(得分:3)

    正如Martinho指出的那样,
  1. alignas不能用于这种情况,因为我们要求的对齐不如结构的自然对齐更严格。这在 dcl.align 标准中指定(强调相关部分):
  2.   

    如果为实体指定了多个alignment-specifiers,则对齐要求应设置为最严格的指定对齐。

         

    声明中所有alignment-specifiers的组合效果不应指定比如果省略所有alignment-specifiers所声明的实体所需的对齐更严格的对齐(包括其他声明中的那些。)

    BMPHeader返回的alignof(BMPHeader)的对齐方式为4,因此任何对齐方式都不会比不会更加严格(不太宽)。

      当使用GCC作为specified in its manual来使结构紧密包装时,
    1. __attribute__ ((packed))肯定是正确的方法。但是,使用GCC时,由于bug in MinGWworks fine,这不起作用。

    2. 因此,目前MinGW唯一的方法就是使用#pragma pack(1)。有关此方法的详细信息,请参阅#pragma pack effect