你和这里的人们就小功能提供建议,正在寻找inline
老式的方法。
inline
曾经的意思是“我希望这段代码快速运行,所以每当我调用这个函数时,我希望你就地扩展它以避免函数调用的开销。”
这是一个非常好的优化。事实上,这太好了,即使你不指定inline
.
编译器也可以自由地不扩展您的inline
功能。所以你真的不必担心它会如何影响性能,因为inline
如果你以愚蠢的方式使用它,编译器可以并且会忽略它。
事实上,今天的编译器几乎总是忽略你对 . 的使用inline
,只做他们认为最好的事情。
那么,知道了这一点,为什么人们仍然使用inline
?
现在使用只有一个理由inline
,那就是解决单一定义规则 (ODR)。
在 C/C++ 中,您只能定义一次函数。如果你这样做:
int foo() { /* do something */ }
int foo() { /* do something else */ }
编译器会抱怨你已经定义了两次相同的函数。
这看起来像一个愚蠢的例子,但是当你使用时特别容易做这样的事情#include
- 如果你在一个标题中定义你的函数,并且你#include
两次使用相同的标题,这正是你正在做的事情。
值得庆幸的是,inline
它还有另一个今天仍然有效的用途:如果您将函数标记为inline
,它会强制编译器消除 ODR 问题,从而可以在标头中定义您的函数。
换句话说,inline
现在的意思是“我想在标题中定义这个函数”。
当您以这种方式看待它时,应该清楚inline
在将函数移动到 cpp 文件时应该删除 。
出于兴趣,有几个地方隐式地使函数内联。其中之一是在类成员函数中:
struct Foo {
void bar() { /* do something */ }
};
我见过人们标记这样inline
的功能,但这完全是多余的。编译器无论如何都会这样做;无需担心 ODR,也不会获得任何性能。
另一个地方在模板中。由于模板必须在标头中定义,因此它们不受 ODR 的约束,并且inline
对它们进行处理是多余的。