如果函数内联过于激进会发生什么?

sha*_*oth 5 c++ compiler-construction performance inline visual-c++

每次我inline在C++中阅读关键字时都会有一个很长的解释,即编译器会进行"速度与代码量"分析,然后决定是否在每个特定情况下内联函数调用.

现在,Visual C++ 9有一个__forceinline关键字似乎使编译器内联调用函数,除非这样的内联是绝对不可能的(如调用是虚拟的).

假设我查看了一些项目而没有理解其中的内容,并确定自己三分之一的函数足够小并且很适合内联并标记它们,__forceinline编译器会内联它们,现在可执行文件变得更大了一百倍.

这真的很重要吗?如果功能过于激进并且可执行文件大一百倍,我应该期待什么效果?

chr*_*ock 5

主要影响将是缓存.内联违背了地方的原则; CPU必须更频繁地从主存储器中获取指令.因此,旨在使代码更快的原因实际上可能会使代码变慢.

  • @zneak:因为程序更大,所以在任何时刻它都不适合缓存. (2认同)

MSa*_*ers 4

其他人已经提到了对缓存的影响。还有另一笔罚款要支付。现代 CPU 速度相当快,但价格也很高。它们有很深的正在处理的指令管道。为了即使在存在条件分支的情况下也能保持这些管道被填充,快速 CPU 使用分支预测。他们记录分支被采用的频率,并用它来预测将来是否会采用分支。

显然,这个历史记录需要内存,而且它是一个固定大小的表。它仅包含有限数量的分支指令。通过将指令数量增加一百倍,分支数量也增加了一百倍。这意味着具有预测的分支数量急剧减少。此外,对于预测表中存在的分支,可用数据较少。