我的问题基于wiki answer的一部分,而Why isn't sizeof for a struct equal to the sum of sizeof of each member?的问题(强调我的问题):
“重要说明:C和C ++标准均声明结构对齐方式是实现定义的。因此,每个编译器都可能选择不同地对齐数据,从而导致不同且不兼容的数据布局。因此,在处理将要一些编译器具有命令行设置和/或特殊的#pragma语句来更改结构对齐设置。“
非常感谢您的帮助。
是否可以在gcc / g ++中更改当前的结构对齐设置?
是。有一个命令行选项:
allignof
没有指定值,将所有结构构件包装在一起而没有孔。指定一个值(必须为2的小数)时,将根据该值打包结构成员,以表示最大对齐(即,默认对齐要求大于此值的对象可能会在下一个装配位置输出未对齐的对象)。
警告:-fpack-struct开关使GCC生成与没有该开关时生成的代码不二进制兼容的代码。此外,它使代码次优。使用它来符合非默认应用程序二进制接口。
和实用说明:
为了与Microsoft Windows编译器兼容,GCC支持#pragma指令可更改成员最大对齐方式结构(零宽度位域除外),联合和类随后定义。始终要求下面的n值为a小二的幂,并以字节为单位指定新的对齐方式。
- [
#include <iostream> struct Foo { int i; float f; char c; }; struct Empty {}; struct alignas(64) Empty64 {}; int main() { std::cout << "Alignment of" "\n" "- char : " << alignof(char) << "\n" "- pointer : " << alignof(int*) << "\n" "- class Foo : " << alignof(Foo) << "\n" "- empty class : " << alignof(Empty) << "\n" "- alignas(64) Empty: " << alignof(Empty64) << "\n"; }
只需设置新的对齐方式。alignas
将对齐方式设置为开始编译时有效的对齐方式(另请参见命令行选项-fpack-struct [=]参见代码生成选项)。- [
-fpack-struct[=n]
将当前对齐方式设置推入内部堆栈,然后选择设置新对齐方式。#pragma pack(n)
将对齐设置恢复为内部堆栈顶部保存的对齐设置(并删除该堆栈条目)。注意##pragma pack()
不会影响此内部堆栈;因此可能有#pragma pack(push[,n])
后跟多个#pragma pack(pop)
实例并由单个pragma pack([n])
完成。[某些目标,例如i386和powerpc,支持ms_struct #pragma列出了
#pragma pack(push)
中记录的结构。
- [
#pragma pack(n)
打开声明的结构的布局。- [
#pragma pack(pop)
关闭声明的结构的布局。- [
__attribute__ ((ms_struct))
返回到默认布局。