我可以检测和更改gcc / g ++中结构的当前数据对齐设置吗?

问题描述 投票:0回答:2

我的问题基于wiki answer的一部分,而Why isn't sizeof for a struct equal to the sum of sizeof of each member?的问题(强调我的问题):

“重要说明:C和C ++标准均声明结构对齐方式是实现定义的。因此,每个编译器都可能选择不同地对齐数据,从而导致不同且不兼容的数据布局。因此,在处理将要一些编译器具有命令行设置和/或特殊的#pragma语句来更改结构对齐设置。

  • 是否可以检测和更改gcc / g ++中的当前结构对齐设置?
  • 如果是,如何检测当前的对齐设置+如何在gcc / g ++中更改它?

非常感谢您的帮助。

c++ c gcc g++ memory-alignment
2个回答
1
投票

对于C ++,从C ++ 11开始,您可以使用alignasalignas可移植地设置并获取任何类型的对齐方式。以下是来自[c0]的cppreference的示例,您可以在其中看到两个示例:

alignof

应注意,alignof不允许您使用比对象默认情况下不严格的对齐方式。这意味着您不能使用它来“打包”,删除数据结构的填充。


0
投票

是否可以在gcc / g ++中更改当前的结构对齐设置?

是。有一个命令行选项:

allignof

没有指定值,将所有结构构件包装在一起而没有孔。指定一个值(必须为2的小数)时,将根据该值打包结构成员,以表示最大对齐(即,默认对齐要求大于此值的对象可能会在下一个装配位置输出未对齐的对象)。

警告:-fpack-struct开关使GCC生成与没有该开关时生成的代码不二进制兼容的代码。此外,它使代码次优。使用它来符合非默认应用程序二进制接口。

和实用说明:

为了与Microsoft Windows编译器兼容,GCC支持#pragma指令可更改成员最大对齐方式结构(零宽度位域除外),联合和类随后定义。始终要求下面的n值为a小二的幂,并以字节为单位指定新的对齐方式。

  1. [#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"; } 只需设置新的对齐方式。
  2. alignas将对齐方式设置为开始编译时有效的对齐方式(另请参见命令行选项-fpack-struct [=]参见代码生成选项)。
  3. [-fpack-struct[=n] 将当前对齐方式设置推入内部堆栈,然后选择设置新对齐方式。
  4. #pragma pack(n)将对齐设置恢复为内部堆栈顶部保存的对齐设置(并删除该堆栈条目)。注意##pragma pack()不会影响此内部堆栈;因此可能有#pragma pack(push[,n])后跟多个#pragma pack(pop)实例并由单个pragma pack([n])完成。

[某些目标,例如i386和powerpc,支持ms_struct #pragma列出了#pragma pack(push)中记录的结构。

  1. [#pragma pack(n)打开声明的结构的布局。
  2. [#pragma pack(pop)关闭声明的结构的布局。
  3. [__attribute__ ((ms_struct))返回到默认布局。
© www.soinside.com 2019 - 2024. All rights reserved.