如何解决使用 `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 并且还有一大堆替代品 here)。这些编译器可能没有这些非常高级的警告,但我还没有验证过。我相信的一个原因是 c lang 没有虚函数,所以我想不出适合零字节对齐的情况(C doesn't allow trivial structs)。
后果
我想到的问题是为什么 gcc 会抛出这些警告?在 c++ 中使用零字节结构是否合适?
答案是没有纯虚拟和抽象类从不编译它们仅用作其他类的基类。我的问题中的 struct a
之类的结构从未出现在程序集中。因此,作为结论,我相信 gcc 和 clang-tidy 的警告都是正确的,但我强烈建议某人不要在非 fpga 项目上使用 clang-tidy fpga 特定标志。Here 和 {{3}是 gcc 方面关于引入这些警告的一些推理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。