I need to define inline functions to improve performance of my code. At the moment declaration of functions are in .h file and definitions are in .cpp file. I added inline keyword at the front of each declaration of functions but I am getting link error. Is possible to separate declaration and definition of inline functions ?
8 回答
您可以很好地将声明和定义分开,但该定义必须在使用该函数的每个翻译单元中可用,例如:
#include <iostream>
inline void foo();
int main() {
foo();
}
inline void foo() {
std::cout << "Hi\n";
}
是完全合法和正确的。
n3290 § 7.1.2.4 的确切引用是:
内联函数应在使用它的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2)。[ 注意:在其定义出现在翻译单元中之前,可能会遇到对内联函数的调用。——尾注]
§ 3.2 基本上说它必须在任何地方都相同,甚至是重载决议等。
是的,但是您必须将实现放在头文件中。那是因为为了被内联,在包含标题时必须知道定义。
如果你这样做了,即使没有inline
关键字,现代编译器也会自动内联函数。
你确定让你的函数“内联”会提高你的性能吗?我很确定它不会。
当且仅当编译器可以看到内联函数的主体时,它才能内联一些函数调用。所以你也需要包含函数的主体,但是如果这样做,你不需要用'inline'注释你的函数,因为编译器只需要函数的主体 - 而不是你的'inline'关键字。现在的编译器很聪明,不用你的提示就能知道是否以及何时内联函数。并且内联并不一定会增加程序的性能,它可能会增加可执行文件的大小。
请参阅Herb Sutter 的这篇文章。他认为关键字“inline”在 C++ 中没有意义。但我不同意他的观点。关键字“内联”有一个区别:您可以在程序中多次指定内联函数的主体(前提是每次定义完全相同)——这在将函数主体放入标头时很有用(如果您需要出于任何原因)。
Use a separate "implementation header" that you will still include everywhere?
您只需要指定一次原型或实现。两者都有资格。
根据定义,内联函数必须在编译时已知。如果要在单独的 .h 文件中定义它们,可以使用
#pragma 一次
只插入一次定义的技巧。
我发现在一些嵌入式工具链中,函数声明中不允许使用#inline 关键字。您可以在定义中指定它,但是(如上所述)许多编译器无论如何都会忽略该关键字。
// 这适用于 g++ 编译器。//计算.h
class Calc
{
int Sum(int x, int y);
};
//计算.cpp
inline int Calc::Sum(int x, int y)
{
return (x+y);
}