【发布时间】:2015-07-05 01:03:10
【问题描述】:
我最近的一个程序高度依赖内联一些“热门”函数来提高性能。这些热函数是外部.c 文件的一部分,我不想更改。
不幸的是,虽然 Visual 非常擅长这个练习,但 gcc 和 clang 却不是。显然,由于热函数在不同的.c 中,它们不能内联它们。
这让我有两个选择:
- 要么直接将相关代码包含到目标文件中。实际上,这意味着
#include "perf.c"而不是#include "perf.h"。微不足道的变化,但看起来很难看。显然它有效。向构建链解释perf.c必须存在但不能编译或链接,这有点复杂。 -
使用
-flto,进行链接时间优化。它看起来更干净,是 Visual 默认实现的。问题是,对于
-flto,gcc 链接阶段会生成多个警告,其中seem to be internal bugs(它们指的是标准库中的部分代码,因此我几乎无法控制它们)。当针对“零警告”策略时,这是令人尴尬的(即使生成的二进制文件非常好)。至于 clang,由于打包错误(错误加载插件:LLVMgold.so)导致
-flto失败,这显然在多个 linux 发行版中很常见。
2 个问题:
- 在 gcc 上使用
-flto时,有没有办法关闭这些警告消息? - 考虑到优缺点,上述两种方法中哪一种看起来更好?
- 可选:还有其他解决方案吗?
【问题讨论】:
-
通常包含内联函数的文件被赋予
.inl扩展名,并在相应标题的底部添加#included。 -
错误报告说它已被修复。是否可以尝试使用最新的 binutils?
-
请说明工具的版本。
-
@blueMoon :不是真的。只为我解决问题不是一种选择。它应该适用于具有不同构建链的其他团队,我无法控制,因此不可能依赖过于特定的版本。除此之外,还有clang的pb...
-
@olaf :我已经用 gcc 4.8.4 和 clang 3.4 进行了测试。但正如之前评论中所说,我需要支持更广泛的配置。
标签: c gcc clang gcc-warning