使用 altera-struct-pack-align 的 Clang-tidy 对齐建议

Clang-tidy alignment suggestion with `altera-struct-pack-align`

我正在尝试使用 clang-tidy(同时使用 gcc)进行所有检查。我很好奇以下情况是否是 clang-tidy 的错误,因为它与我的编译器的警告相矛盾。这是一个最小的例子:

struct a{
    virtual void func()=0;
    virtual void func2()=0;
}; 
struct b:a{
    void func() override {};
    void func2() override {};
private: 
   int x{};
    
}
int main(){
    b b_item;
}

建议:

/home/main.cpp:7:8: note: use "__attribute__((aligned(0)))" to align struct 'a' to 0 bytes
struct a{
       ^
/home/main.cpp:13:8: warning: accessing fields in struct 'b' is inefficient due to padding; only needs 4 bytes but is using 16 bytes [altera-struct-pack-align]
struct b:a{
       ^

我不会演示建议后的代码,因为 clang-tidy 做了很多更改,重要的一点是:

struct a{
    virtual void func()=0;
    virtual void func2()=0;
} __attribute__((aligned(0))); 

调用修复后警告:

warning: requested alignment ‘0’ is not a positive power of 2 [-Wattributes]
   12 | } __attribute__((aligned(0)));

推理

毕竟原因很简单。 clang-tidy 的 altera* 选项与 C 中的 fpga 编程相关,并考虑了一些非常具体的编译器(我认为 altera 使用 c2h and there is also a big list of alternatives here). These compilers probably doesn't have these quite advanced warning but I haven't verified that yet. A reason I believe that is that c lang doesn't have virtual functions so I can not think of a case where zero byte alignment would be appropriate(C doesn't allow trivial structs)。

后果

我想到的问题是为什么 gcc 会抛出这些警告?在 C++ 中使用零字节结构是否合适? 答案是没有纯粹的虚拟和抽象 类 从不编译它们仅用作其他人的基础 类。我问题中的 struct a 之类的结构从未出现在汇编中。因此,作为结论,我相信 gcc 和 clang-tidy 的警告都是正确的,但我强烈建议某人不要在非 fpga 项目上使用 clang-tidy fpga 特定标志。Here and here 是 gcc 的一些推理关于介绍这些警告的一面。