【问题标题】:Clang-tidy alignment suggestion with `altera-struct-pack-align`使用 `altera-struct-pack-align` 的 Clang-tidy 对齐建议
【发布时间】:2021-01-20 17:41:52
【问题描述】:

我正在尝试使用 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)));

【问题讨论】:

    标签: c++ alignment memory-alignment clang-tidy


    【解决方案1】:

    推理

    毕竟原因很简单。 clang-tidy 的 altera* 选项与 C 中的 fpga 编程相关,并考虑了一些非常具体的编译器(我认为 altera 使用 c2h 并且还有一大堆替代方案 here)。这些编译器可能没有这些非常高级的警告,但我还没有验证过。我相信的一个原因是 c lang 没有虚函数,所以我想不出适合零字节对齐的情况(C doesn't allow trivial structs)。

    后果

    我想到的问题是为什么 gcc 会抛出这些警告?在 c++ 中使用零字节结构是否合适? 答案是没有纯粹的虚拟和抽象类永远不会编译它们只用作其他人的基类。像我的问题中的 struct a 这样的结构永远不会出现在程序集中。所以作为一个结论,我相信 gcc 和 clang-tidy 的警告都是正确的,但我强烈建议不要在非 fpga 项目上使用 clang-tidy fpga 特定标志。Herehere 是一些推理关于引入这些警告的 g​​cc 方面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-23
      • 2021-07-07
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2018-10-01
      相关资源
      最近更新 更多