【发布时间】:2011-10-26 04:03:18
【问题描述】:
根据我的经验,有很多代码显式使用内联函数,这是一个折衷方案:
- 代码变得不那么简洁,可维护性也有所降低。
- 有时,内联可以大大提高运行时性能。
- 内联是在一个固定的时间点决定的,可能没有很好地预知它的用途,或者没有考虑所有(未来的)周围环境。
问题是:链接时优化(例如,在 GCC 中)是否呈现手动内联,例如,在 C99 中声明一个函数“内联”并提供一个实现,过时了?我们自己不需要考虑对大多数函数进行内联,这是真的吗?那些总是从内联中受益的函数呢,例如 deg_to_rad(x)?
澄清:无论如何,我并不是在考虑在同一个翻译单元中的函数,而是在逻辑上应该驻留在不同翻译单元中的函数。
更新:我经常看到反对“内联”的反对意见,并且建议它已过时。然而,就个人而言,我确实经常看到显式内联函数:作为在类主体中定义的函数。
【问题讨论】:
-
请注意,没有“总是受益于内联的函数”这样的东西。如果您的
deg_to_rad在代码中的许多不同位置被多次调用,则会大大增加代码大小,从而导致缓存/分页问题。 -
声明一个函数
inline几乎是无操作的。一个好的编译器会忽略内联决策的关键字,并自行选择是否内联。 -
@Oli Charlesworth:您假设调用的指令数小于函数的指令数。内联
int add(int x,int y) {return x+y;}总是有益的,因为不仅调用成本而且进行调用的指令数都高于函数体的成本。我认为 deg_rad() 也属于这一类,因为它非常简单。 -
我经常看到 Crashworks 看到的东西。在缺乏运行时知识和完美的 CPU 架构知识之间,编译器不可能做出始终如一的最佳内联决策。这对人类来说也很困难,但严格来说,并非不可能,尤其是在专注于一小段关键代码时。
-
@Martin:你是说编译器总是可以在他们想要的时候内联,还是他们总是做出正确的决定? LTO 现在当然允许前者,但后者不是任何编译器技术都可以声称的。
标签: c++ c optimization gcc