传统观点认为函数内联并不总是有益,甚至会损害性能:
- The Linux kernel style guide警告不要过度内联
- 谷歌也 recommends programmers be careful with inlining
- C++ FAQ lite说更多相同的话
我理解为什么内联应该有所帮助 - 它通过将被调用函数包含在其调用者中来消除函数调用开销。
我也理解为什么人们声称它会损害性能——内联函数在某些情况下会增加代码大小,最终会增加缓存未命中率甚至触发额外的页面错误。这一切都是有道理的。
不过,我很难找到内联实际上会损害性能的具体示例。当然,如果这个问题足以值得警告,那么某个地方的某个人一定遇到过内联是一个问题的例子。所以,我问...
什么是一个好的、具体的代码示例,其中函数内联实际上会损害性能?
最佳答案
在某些具有大量内联函数的平台上,可以通过导致“远”跳转而不是相对跳转来降低性能。内联也可能导致页面错误,操作系统需要将更多代码拖入内存,而不是执行可能已经存在的代码(作为子例程)。
某些平台可能针对“近代码”优化了跳转指令。这种类型的跳转使用当前位置的有符号偏移量。带符号的偏移量可能会受到限制,例如 127 字节。长跳转需要更大的指令,因为较长的跳转必须包含绝对地址。较长的指令需要更多的时间来执行。
长内联函数可能会扩展可执行文件的长度,因此操作系统需要将新“页面”拖入内存,称为页面交换。页面交换会减慢应用程序的执行速度。
这些是内联代码会降低性能的“可能”原因。真正的真相是通过剖析获得的。
关于c++ - 函数内联——有哪些损害性能的例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5808498/