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

标签 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 位环境中使用 Windows 7 操作系统。链接问题的第一个答案说上面的代码将在 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;

关于c++ - 为什么 g++ 不在这里执行结构打包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32808572/

相关文章:

c++ - 使用 OpenCV 计算特征值、特征向量

c++ - QT中如何将图表保存为图片

python - 如何创建指向正在定义的结构的指针?

visual-studio-code - 项目结构到图形布局(VSCode)?

wpf - wpf ListView GridView 上的边距/填充设置在哪里?

java - 为什么我解密时得到 'BadPaddingException'?

c - 为什么 GCC 填充这个位域?

c++ - 将所有值分配给结构体有什么意义吗?

c++ - 如何请求 C++ 功能?

swift - 为什么常量约束来自结构实例而不是类实例的属性?