Clang中是否有一个编译标志来强制编译器阻止C中的结构填充?

gopyfrb3  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(107)

必须为每个结构声明标注打包属性。“我想知道是否存在一个编译器标志来自动打包所有结构?
尝试查看clang文档以及定义选项,但似乎没有适合的

lsmd5eda

lsmd5eda1#

试试-fpack-struct。在GCC文档中,该标志也可以在Clang中使用:
-fpack-struct[=n]
如果未指定值,则将所有结构杆件打包在一起,不带孔。指定值(必须是2的小幂)后,根据此值打包结构成员,表示最大对齐(即,默认对齐要求大于此值的对象在下一个配件位置可能未对齐)。

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

jgzswidk

jgzswidk2#

还请注意,Clang(作为GCC)支持#pragma pack的MSVC扩展,以便在长时间运行的代码中启用选择性打包。
然后,您可以在结构定义的周围添加

#pragma pack(push,1)

struct One {
  ...
};
...
struct Nth {
  ...
};

#pragma pack(pop)

字符串
并且其间的所有内容将被字节打包(请求1字节对齐)。
这通常是非常可取的,因为您可以将打包限制为您绝对需要的存储定义,而所有其余的代码将遵循一般规则-不会破坏与其他源的兼容性,并且不会错过编译器希望强制执行的数据访问优化。
参见Clang手册和MSVC reference

相关问题