必须为每个结构声明标注打包属性。“我想知道是否存在一个编译器标志来自动打包所有结构?尝试查看clang文档以及定义选项,但似乎没有适合的
lsmd5eda1#
试试-fpack-struct。在GCC文档中,该标志也可以在Clang中使用:-fpack-struct[=n]个如果未指定值,则将所有结构杆件打包在一起,不带孔。指定值(必须是2的小幂)后,根据此值打包结构成员,表示最大对齐(即,默认对齐要求大于此值的对象在下一个配件位置可能未对齐)。
-fpack-struct
-fpack-struct[=n]
警告:-fpack-struct开关导致GCC生成的代码与不使用该开关生成的代码不二进制兼容。此外,它使代码次优。使用它来符合非默认的应用程序二进制接口。
jgzswidk2#
还请注意,Clang(作为GCC)支持#pragma pack的MSVC扩展,以便在长时间运行的代码中启用选择性打包。然后,您可以在结构定义的周围添加
#pragma pack
#pragma pack(push,1) struct One { ... }; ... struct Nth { ... }; #pragma pack(pop)
字符串并且其间的所有内容将被字节打包(请求1字节对齐)。这通常是非常可取的,因为您可以将打包限制为您绝对需要的存储定义,而所有其余的代码将遵循一般规则-不会破坏与其他源的兼容性,并且不会错过编译器希望强制执行的数据访问优化。参见Clang手册和MSVC reference
2条答案
按热度按时间lsmd5eda1#
试试
-fpack-struct
。在GCC文档中,该标志也可以在Clang中使用:-fpack-struct[=n]
个如果未指定值,则将所有结构杆件打包在一起,不带孔。指定值(必须是2的小幂)后,根据此值打包结构成员,表示最大对齐(即,默认对齐要求大于此值的对象在下一个配件位置可能未对齐)。
警告:
-fpack-struct
开关导致GCC生成的代码与不使用该开关生成的代码不二进制兼容。此外,它使代码次优。使用它来符合非默认的应用程序二进制接口。jgzswidk2#
还请注意,Clang(作为GCC)支持
#pragma pack
的MSVC扩展,以便在长时间运行的代码中启用选择性打包。然后,您可以在结构定义的周围添加
字符串
并且其间的所有内容将被字节打包(请求1字节对齐)。
这通常是非常可取的,因为您可以将打包限制为您绝对需要的存储定义,而所有其余的代码将遵循一般规则-不会破坏与其他源的兼容性,并且不会错过编译器希望强制执行的数据访问优化。
参见Clang手册和MSVC reference