【问题标题】:MinGW and packed struct alignment using C++11使用 C++11 的 MinGW 和打包结构对齐
【发布时间】:2013-11-22 11:44:54
【问题描述】:

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

  1. C++11 的alignas(1)
  2. struct __attribute__ ((packed)) BMPHeader
  3. #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;
}

【问题讨论】:

  • alignas(1) 不起作用。有了这个,你不能请求比自然对齐更严格的对齐。

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


【解决方案1】:
  1. 正如 Martinho 所说,alignas 不能在这种情况下使用,因为我们要求的对齐方式比结构的自然对齐方式更严格。这在 dcl.align 下的标准中指定(强调相关部分):

当为一个实体指定多个对齐说明符时,对齐要求应设置为最严格的指定对齐。

声明中所有对齐说明符的组合效果不应指定比省略所有对齐说明符时被声明的实体所需的对齐方式更严格的对齐方式(包括其他声明中的内容)。

alignof(BMPHeader) 返回的 BMPHeader 的对齐方式是 4,因此任何比这更严格(更宽)的对齐方式都不会得到尊重。

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

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

另见

【讨论】:

  • 此答案中链接到的错误现在可能已在 gcc 8 中修复。请参阅this comment
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2014-02-19
  • 2012-12-02
  • 1970-01-01
相关资源
最近更新 更多