C++ 对不带参数的void函数使用inline

C++ 对不带参数的void函数使用inline,c++,C++,更换有无潜在的性能提升 void foo(void){/*some statement*/} 与 是的,除了调用的小但非零的代价之外:与函数调用相比,优化者可能能够做更多的事情来优化内联代码。非内联函数调用会招致一些轻微的惩罚,即使您不来回传递任何参数。例如,函数在完成执行后应该返回的地址需要存储在某个地方 如果我是你,在决定是否内联时,我不会特别区分void函数和其他类型的函数。还有其他更重要的方面决定内联是否有用,例如: 呼叫频率越高,越有利于内联 函数的大小越大,越不利于内联 使用内联函

更换有无潜在的性能提升

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


是的,除了调用的小但非零的代价之外:与函数调用相比,优化者可能能够做更多的事情来优化内联代码。

非内联函数调用会招致一些轻微的惩罚,即使您不来回传递任何参数。例如,函数在完成执行后应该返回的地址需要存储在某个地方

如果我是你,在决定是否内联时,我不会特别区分void函数和其他类型的函数。还有其他更重要的方面决定内联是否有用,例如:

呼叫频率越高,越有利于内联 函数的大小越大,越不利于内联
使用内联函数时,可以避免函数调用的开销—为函数创建堆栈、将参数推送到堆栈、管理堆栈返回值以及删除堆栈。这将提高性能


在本例中,您没有任何输入参数和返回值。因此,函数调用的成本将稍微降低。它仍然比内联函数更昂贵。

内联函数与参数和返回类型完全正交。

没有函数调用和返回开销。它可能会阻止指令缓存重新加载。一旦函数体内联,编译器将被允许执行更多的优化

还有一些解释:

CPU会在看到需要指令时加载指令,所以若函数是内联的,那个么CPU可以在一次读取中加载整个代码,从而减少CPU暂停。但如果这个函数实际上相当大,并且不经常执行,那么内联实际上可能会造成更大的危害,因为CPU可能会加载更多必要的缓存线。下面是一个例子:

if ( condition ) {
  // do some logic here
}
else {
  foo(); 
}
现在若条件大部分为真,那个么若foo并没有内联就更好了,若条件大部分为假,那个么若它是内联的就更好了。因此,为了使代码更易于缓存,实际上应该找到一个最常见的执行路径,并使其使用尽可能少的if-s和可能少的函数调用

在这种情况下,函数调用开销是由于需要在堆栈上保存寄存器(寄存器的数量取决于实际代码)、递增堆栈指针以及跳转到函数代码。完成该功能后,CPU需要将堆栈和寄存器恢复到以前的状态。这显然是大量的工作,尤其是在紧循环中调用函数时


最后,重要的是要记住内联只是编译器的一个提示。作为一名程序员,你知道代码是如何执行的,你应该利用这些知识来构造代码,使其更易于缓存。

函数在完成执行后返回的地址需要存储在某个地方:这是一个很好的观点。+1用于提及缓存。IMHO,这是最大的性能问题。你能解释一下缓存问题吗?为什么函数调用没有开销?只是想澄清一下,你是在问内联关键字是否会添加任何内容?因为头文件中具有主体的函数已内联。您的函数是在头文件中还是在cpp文件中?
if ( condition ) {
  // do some logic here
}
else {
  foo(); 
}