使用inline获取不带参数的void函数

时间:2014-03-27 21:52:13

标签: c++

替换

是否有任何潜在的性能提升
void foo(void){/*some statement*/}

inline void foo(void){/*some statement*/}

5 个答案:

答案 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)

inlineparameterreturn类型完全正交。

相关问题