对不带参数的void函数使用内联
Using inline for a void function that takes no parameters
更换
是否有潜在的性能提升?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
是否有帮助,例如:
- 呼叫频率(高号码优先内联)
- 函数的大小(较大的大小有利于不内联)
inline
与parameter
、return
型完全正交
函数调用的开销——为函数创建堆栈、将参数压入堆栈、管理堆栈的返回值以及删除堆栈——在使用内联函数时可以避免。这将提高性能。
在您的示例中,您没有任何输入参数和返回值。所以函数调用的成本会减少一点。它仍然会比内联函数更昂贵。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么全局函数 void showA(A&x) 能够访问 A 类的私有成员?
- 如何将函数<void()>写入管道/套接字对?
- 错误:无法在没有对象的情况下调用成员函数'void Fortest::run()'|
- 标准的大小::函数<void(int&)>类型
- 如何函数<void(字符串消息)>绑定到成员函数?
- 函数void()返回一个值,而不是char或string
- 函数void QQuickWindow::setDefaultAlphaBuffer(bool useAlpha)的用途
- 错误 LNK2019:函数 "void __cdecl Padding(int)" 中引用未解析的外部符号___iob_func
- 我可以有一个~析构函数(void)吗?
- 函数<void(T)> 带有默认参数的参数
- 错误:参数太少,无法函数"void alpha(std::string*,student)"