为啥 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 更大的数字?

为啥将视频转为GIF后,文件反而比视频大的多了?

为啥使用异步请求而不是使用更大的线程池?

为啥缩放以填充比 UIImageVIew 尺寸更大的图像? (使用快速)

深入研究Clang(十四) clang-tidy的使用