对不带参数的void函数使用内联

Using inline for a void function that takes no parameters

本文关键字:函数 void 参数      更新时间:2023-10-16

更换

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

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

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

更多说明:

CPU将加载指令时,它会看到它需要他们,所以如果函数将内联,那么CPU可以加载整个代码在一次读取造成更少的CPU停滞。但是,如果这个函数实际上非常大,并且不经常执行,那么内联它实际上可能会造成更大的伤害,因为CPU可能会加载更多必要的缓存行。下面是示例:

if ( condition ) {
  // do some logic here
}
else {
  foo(); 
}

如果condition基本为真,那么foo()不内联会更好,如果condition基本为假,那么内联会更好。因此,为了使你的代码对缓存更友好,你应该找到一个最常见的执行路径,并使它尽可能少地使用if-s和尽可能少的函数调用。

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

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

是(除了调用的小但非零成本):优化器可能能够比函数调用做更多的优化内联代码。

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

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

  • 呼叫频率(高号码优先内联)
  • 函数的大小(较大的大小有利于不内联)

inlineparameterreturn型完全正交

函数调用的开销——为函数创建堆栈、将参数压入堆栈、管理堆栈的返回值以及删除堆栈——在使用内联函数时可以避免。这将提高性能。

在您的示例中,您没有任何输入参数和返回值。所以函数调用的成本会减少一点。它仍然会比内联函数更昂贵。