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

Des*_*tor 2 c++ structure sizeof padding memory-alignment

考虑以下程序:

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

这个我明白了以下几点:

  • 结构填充可抑制结构填充,对齐最重要时使用的填充,空间最重要时使用的填充。
  • 另一方面,Structure Packing阻止编译器进行填充

我在32位环境中,正在使用Windows 7 OS。链接问题的第一个答案说,以上代码将在32位体系结构上生成6号大小的结构。

但是,当我使用g ++ 4.8.1对其进行编译时,它的输出为9。那么,结构打包在这里不会完全发生吗?为什么输出中要多出3个字节?sizeof char始终为1。在我的编译器中,sizeof int为4。因此,压缩结构时,以上结构的sizeof应该为1 + 4 + 1 = 6。

我在这里试过。它给了我预期的输出6。

处理器有任何作用还是仅取决于编译器?

小智 5

在mingw32编译器上,打包的属性已损坏。另一种选择是使用 pragma pack

#pragma pack(1)
struct mystruct_A {
  char a;
  int b;
  char c;
} x;
Run Code Online (Sandbox Code Playgroud)