为什么在调用函数时会有开销?

Kam*_*nco 6 c optimization performance memory-management overhead

人们常常说,在程序中调用函数会产生一定的开销,或者不可避免地会产生其他问题。与没有该函数调用的类似程序相比,这可以更好地解释吗?

Jen*_*ens 6

另请参阅此处此处以讨论何时内联有意义。

  • 内联

    通常,您只能向编译器建议inline一个函数,但编译器可能会另有决定。不过,Visual Studio 提供了自己的forceinline关键字。某些函数不能内联,例如当它们是递归的或在编译时无法确定目标函数时(通过函数表调用,C++ 中的虚函数调用)。

    我建议您相信编译器是否应该内联函数。如果您真的想内联您的代码,请考虑使用宏。

  • 高架

    当您使用函数时,内存开销最小,因为您不会重复代码;内联代码被复制到调用站点中。这些天的性能开销可以忽略不计,因为现代架构真的很好地预测和调用,只有大约 1-2 个周期的开销。


Fra*_*ard 6

这取决于您的编译器设置及其优化代码的方式。一些函数是内联的。其他人不是。这通常取决于您是针对大小还是针对速度进行优化。

通常,调用函数导致延迟的原因有两个:

  • 该程序需要挂钩到内存中函数代码开始的某个随机位置。为此,它需要将当前光标位置保存到堆栈中,以便知道从哪里返回。这一过程消耗了不止一个 CPU 周期。

  • 根据您的 CPU 架构,可能有一个管道,它与您当前的指令执行并行地将下几条指令从内存中提取到 CPU 缓存中。这是为了加快执行速度。当你调用一个函数时,游标钩到一个完全不同的地址,所有缓存的指令都从管道中刷新。这会导致进一步的延误。

  • 1) 和 2) 不是常态。现代架构非常适合预测代码执行。另请注意,函数调用_总是_可预测的,因为您知道执行的去向,因此您可以预取代码并填充管道。那里没有延误。 (5认同)