为啥 Clang-Tidy 建议进行更大的对齐?
Posted
技术标签:
【中文标题】为啥 Clang-Tidy 建议进行更大的对齐?【英文标题】:Why does Clang-Tidy suggest a larger alignment?为什么 Clang-Tidy 建议进行更大的对齐? 【发布时间】:2020-10-27 03:08:50 【问题描述】:给定以下c语言结构定义:
typedef struct PackTest
long long a;
int b;
int c;
PackTest;
Clang-Tidy 给出以下信息:
由于对齐不佳,访问 struct 'PackTest' 中的字段效率低下;当前对齐为 8 个字节,但建议对齐为 16 个字节
我知道为什么 struct 对齐到 8 个字节,但我不知道这个建议是否有效以及为什么。
【问题讨论】:
你能发布一个完整的程序来提供信息吗? 这是一个真的,真的不负责任的警告。没有可笑地过度对齐的标准结构并没有什么“不整洁”。出于非常特殊的目的,您可能需要一个过度对齐的对象,但如果它标记了这个,那么它标记的大多数东西都是错误的,并鼓励您编写效率低下且无缘无故不标准的代码。 【参考方案1】:某些特定的专用汇编指令可能有对齐要求(例如,x86 非标量 SSE 指令严格要求对齐到 16 字节边界)。当用于未与 16 字节边界对齐的数据(例如,x86 SSE2)时,其他指令的吞吐量可能较低。
这类指令通常用于根据处理器的硬件特性进行积极的优化。总体而言,您收到的消息仅在这些情况下有用(即,如果您确实打算利用这些说明)。
另见:
What does alignment to 16-byte boundary mean in x86 Why and where align 16 is used for SSE alignment for instructions?最后,我将引用 the above comment 中的 Rich,因为它们的观点非常好:
没有可笑的过度对齐的标准结构没有什么“不整洁”。出于非常特殊的目的,您可能需要一个过度对齐的对象,但如果它标记了这一点,那么它标记的大多数东西都是错误的,并鼓励您编写效率低下且无缘无故不标准的代码。
【讨论】:
为了保护 clang-tidy,这个建议只有在设置了与 FPGA 开发相关的 altera 标志时才会出现。 @SpyrosMourelatos,在 clang tidy 14 中,它在*
之后立即处于活动状态。【参考方案2】:
您可以为 Clang-Tidy 添加 -altera-struct-pack-align
以禁用此警告
来源:https://www.mail-archive.com/cfe-commits@lists.llvm.org/msg171275.html
【讨论】:
以上是关于为啥 Clang-Tidy 建议进行更大的对齐?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 xarray DataArray 与长度为 1 的维度与更大的数组对齐?
为啥 double 可以存储比 unsigned long long 更大的数字?