我最近的一个程序在很大程度上取决于为性能编写一些“热门”函数。这些热门函数是外部.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个问题:
-flto
时,有没有办法关闭这些警告消息?答案 0 :(得分:2)
根据你的评论,你必须支持gcc 4.4。由于LTO始于gcc 4.5(对早期版本一无所知),答案应该清楚。 否-flto
。
所以,#include
代码当然要小心谨慎。
更新
但文件扩展名不应为.c
,但例如.inc
(.i
也是一个坏主意)。更好的是:.h
并将功能更改为static inline
。这仍然可能无法保证内联,但这与所有函数相同,并且它保持了干净标题的外观(尽管较长的inline
函数仍然是错误的样式)。
在完成所有这些操作之前,如果代码确实有问题,我会正确分析。首先应该集中精力编写可读和可维护的代码。