为什么 g++ 不在这里执行结构打包?

Why g++ isn't performing structure packing here?

考虑以下程序:

#include <iostream>
struct __attribute__((__packed__)) mystruct_A
{
   char a;
   int b;
   char c;
}x;
int main()
{
    std::cout<<sizeof(x)<<'\n';
}

来自this 我的理解如下:

我在 32 位环境中并使用 Windows 7 OS。链接问题的第一个答案说上面的代码将在 32 位架构上生成大小为 6 的结构。

但是当我使用 g++ 4.8.1 编译它时,它给出了 9 作为输出。那么,结构包装不是完全发生在这里吗? 为什么输出中有额外的 3 个字节? sizeof char 始终为 1。在我的编译器上,sizeof int 为 4。所以,结构体打包时,上面结构体的sizeof应该是1+4+1=6。

我在 here 上试过了。它给了我预期的输出 6。

处理器有什么作用还是只依赖编译器?

打包的属性是 broken on mingw32 compilers。另一种选择是使用 pragma pack:

#pragma pack(1)
struct mystruct_A {
  char a;
  int b;
  char c;
} x;

这里的解决方案对我有用:https://wintermade.it/blog/posts/__attribute__packed-on-windows-is-ignored-with-mingw.html,即在编译器标志中添加 -mno-ms-bitfields