内联C代码:-flto或不-flto

时间:2015-07-05 01:03:11

标签: c gcc clang gcc-warning

我最近的一个程序在很大程度上取决于为性能编写一些“热门”函数。这些热门函数是外部.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个问题:

  1. 在gcc上使用-flto时,有没有办法关闭这些警告消息?
  2. 鉴于pro和con?
  3. ,上述两种方法中的哪一种似乎更好
  4. 可选:还有其他解决方案吗?

1 个答案:

答案 0 :(得分:2)

根据你的评论,你必须支持gcc 4.4。由于LTO始于gcc 4.5(对早期版本一无所知),答案应该清楚。 -flto

所以,#include代码当然要小心谨慎。

更新

但文件扩展名不应为.c,但例如.inc.i也是一个坏主意)。更好的是:.h并将功能更改为static inline。这仍然可能无法保证内联,但这与所有函数相同,并且它保持了干净标题的外观(尽管较长的inline函数仍然是错误的样式)。

在完成所有这些操作之前,如果代码确实有问题,我会正确分析。首先应该集中精力编写可读和可维护的代码。