使用 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 的一些推理关于介绍这些警告的一面。
我正在尝试使用 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 的一些推理关于介绍这些警告的一面。