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

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

每个结构声明都必须注释用于打包的属性。我想知道是否存在一个编译器标志来自动打包所有结构?

尝试查看 clang 文档并定义选项,但似乎没有合适的

c clang
2个回答
3
投票

尝试

-fpack-struct
。来自 GCC 文档,但是该标志也可以在 Clang 中使用:

-fpack-struct[=n]

在没有指定值的情况下,将所有结构成员无孔地包装在一起。当指定一个值(必须是 2 的小幂)时,根据该值打包结构成员,表示最大对齐(即,默认对齐要求大于此的对象在下一个拟合位置可能会不对齐地输出。

警告:

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


1
投票

另请注意,Clang(作为 GCC)确实支持

#pragma pack
的 MSVC 扩展,以在长时间运行的代码上启用选择性打包。

然后您可以用

包围您的结构定义
#pragma pack(push,1)

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

#pragma pack(pop)

并且其间的所有内容都将被字节打包(请求 1 字节对齐)。

这通常是非常理想的,因为您可以将打包限制为您绝对需要的存储定义,而所有其余代码将遵循一般规则 - 不会破坏与其他源的兼容性,并且不会错过数据访问优化编译器想要强制执行。

请参阅 Clang 手册MSVC 参考

© www.soinside.com 2019 - 2024. All rights reserved.