通常,人们会谈到函数调用所产生的一定量的开销,或者是程序中不可避免的一组额外关注和情况。能否更好地解释并将其与没有函数调用的类似程序进行比较?
通常,人们会谈到函数调用所产生的一定量的开销,或者是程序中不可避免的一组额外关注和情况。能否更好地解释并将其与没有函数调用的类似程序进行比较?
这取决于您的编译器设置和代码优化方式。有些函数被内联,而其他函数则没有。通常这取决于您是为大小还是为速度进行优化。
通常,调用函数会导致延迟,原因如下:
程序需要钩到某个随机内存位置,该位置是函数代码的起始位置。为了做到这一点,它需要将当前光标位置保存到堆栈中,以便知道返回的位置。这个过程消耗超过一个 CPU 周期。
根据您的 CPU 架构,可能存在一个流水线,它可以将下一条指令从内存并行地提取到 CPU 缓存中,以加快执行速度。当您调用函数时,光标钩子到完全不同的地址,并且所有缓存的指令都从流水线中刷新。这会导致进一步的延迟。
内联
通常情况下,你只能向编译器建议将函数inline
,但编译器可能会作出不同的决定。Visual Studio提供了自己的forceinline
关键字。有些函数不能内联,例如递归函数或目标函数不能在编译时确定(通过函数表调用、C++中的虚函数调用)。
我建议你相信编译器是否应该内联函数。如果你真的想要内联你的代码,请考虑使用宏代替。
开销
使用函数可以将内存开销降到最低,因为你不会复制代码;内联代码会被复制到调用站点。现代架构非常擅长预测和调用,因此性能开销现在可以忽略不计,仅有约1-2个周期的开销。
这些函数可以被内联
,但通常函数会在特定地址处,将传递给函数的值放在堆栈上,然后将结果放在堆栈上并返回。