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

Posted

技术标签:

【中文标题】为啥 g++ 不在这里执行结构打包?【英文标题】:Why g++ isn't performing structure packing here?为什么 g++ 不在这里执行结构打包? 【发布时间】:2015-12-24 20:15:25 【问题描述】:

考虑以下程序:

#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 操作系统。链接问题的第一个答案说,上述代码将在 32 位架构上生成大小为 6 的结构。

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

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

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

【问题讨论】:

@JohnZwinck:如果您在 clang 上测试,请附上链接。 我在我的 Macbook,64 位,Clang 3.5 上对其进行了测试。 @AndreyNasonov:不工作。它仍然给出 9 作为输出 您使用的是 x86 CPU 吗?另外,哪个编译器? (g++ 到 windows 32 有两个不同的端口,mingw 和 mingw-w64) 将 mingw-w64-i686-gcc 5.2 与此处提到的任何 __attribute__((packed)) 变体一起使用,我得到尺寸 9。使用 mingw-w64-i686-clang 3.7 和相同的属性,我得到尺寸 6 . 再次使用 g++ 和 #pragma pack(push, 1) / #pragma pack(pop) 在结构周围,我也得到大小 6。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于为啥 g++ 不在这里执行结构打包?的主要内容,如果未能解决你的问题,请参考以下文章

为啥winsock 不在这里提供WSAESHUTDOWN?

为啥 Oracle 不在这里抛出“不明确的列引用”?

如何将Python脚本打包成exe执行文件

SweetAlert2 第一次提示为啥不在中间

为啥这里使用立即执行?

为啥精灵不在 OpenGL 中渲染?