为什么 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 我的理解如下:
- 结构填充抑制结构填充,填充时使用
对齐最重要,当 space 最重要时使用的包装。
- 结构打包,另一方面阻止编译器做
填充
我在 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
。
考虑以下程序:
#include <iostream>
struct __attribute__((__packed__)) mystruct_A
{
char a;
int b;
char c;
}x;
int main()
{
std::cout<<sizeof(x)<<'\n';
}
来自this 我的理解如下:
- 结构填充抑制结构填充,填充时使用 对齐最重要,当 space 最重要时使用的包装。
- 结构打包,另一方面阻止编译器做 填充
我在 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
。