替换
是否有任何潜在的性能提升void foo(void){/*some statement*/}
与
inline void foo(void){/*some statement*/}
答案 0 :(得分:3)
没有函数调用和返回开销。它可能会阻止指令缓存重新加载。一旦函数体内联,编译器将被允许执行更多优化。
更多解释:
CPU会在看到它需要它们时加载指令,因此如果函数将被内联,那么CPU可以在一次读取中加载整个代码,从而导致更少的CPU停顿。但是,如果此函数实际上非常大并且不经常执行,那么内联它实际上可能会造成更多伤害,因为CPU可能会加载更多必要的缓存行。以下是示例:
if ( condition ) {
// do some logic here
}
else {
foo();
}
现在如果条件大部分为真,那么如果foo()没有内联则更好,如果条件大多为假,那么如果它是内联的则更好。因此,为了使您的代码更加缓存友好,您实际上应该找到最常见的执行路径,并使其与if-s和可能很少的函数调用一起使用。
在这种情况下,函数调用开销是由需要在堆栈上保存寄存器(多少取决于实际代码),递增堆栈指针和跳转到funciton代码引起的。功能完成后,CPU需要恢复堆栈并注册到之前的状态。这显然是很多工作,特别是如果在紧密循环内调用函数。
最后重要的是要记住内联只是对编译器的一个提示。作为程序员,您了解代码的执行方式,并且应该使用这些知识来构建代码,使其更加缓存。
答案 1 :(得分:1)
是(除了调用的小但非零成本):优化器可能能够做更多的事情来优化内联代码,而不是函数调用。
答案 2 :(得分:1)
即使您没有来回传递任何参数,非内联函数调用也会产生一些轻微的恶意。例如,函数在完成执行后应返回的地址需要存储在某处。
如果我是你,在决定是否inline
时,我会对void-void函数和其他类型的函数没有特别的区别。还有其他更重要的方面可以决定inline
是否有用,例如:
答案 3 :(得分:1)
当你有一个内联函数时,可以避免函数调用的开销 - 为函数创建堆栈,将参数推送到堆栈,管理堆栈的返回值以及删除堆栈。这样可以提高性能。
在您的情况下,您没有任何输入参数和返回值。因此,函数调用的成本将会降低一点。它仍然比内联函数更昂贵。
答案 4 :(得分:1)
inline
与parameter
和return
类型完全正交。