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

时间:2015-09-27 13:45:19

标签: c++ structure padding sizeof memory-alignment

考虑以下计划:

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

来自this我理解了以下内容:

  • 结构填料抑制结构填料,填料时使用 对齐最重要,当空间最重要时使用包装。
  • 结构打包,另一方面阻止编译器这样做 填充

我在32位环境&amp;使用Windows 7操作系统。链接问题的第一个答案是,上面的代码将在32位架构上产生大小为6的结构。

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

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

处理器是否有任何作用,或者仅取决于编译器?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

相关问题