9

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 ?

4

8 回答 8

9

您可以很好地将声明和定义分开,但该定义必须在使用该函数的每个翻译单元中可用,例如:

#include <iostream>

inline void foo();

int main() {
  foo();
}

inline void foo() {
  std::cout << "Hi\n";
}

是完全合法和正确的。


n3290 § 7.1.2.4 的确切引用是:

内联函数应在使用它的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2)。[ 注意:在其定义出现在翻译单元中之前,可能会遇到对内联函数的调用。——尾注]

§ 3.2 基本上说它必须在任何地方都相同,甚至是重载决议等。

于 2012-07-11T08:05:10.587 回答
3

是的,但是您必须将实现放在头文件中。那是因为为了被内联,在包含标题时必须知道定义。

如果你这样做了,即使没有inline关键字,现代编译器也会自动内联函数。

于 2012-07-11T08:05:07.587 回答
3

你确定让你的函数“内联”会提高你的性能吗?我很确定它不会。

当且仅当编译器可以看到内联函数的主体时,它才能内联一些函数调用。所以你也需要包含函数的主体,但是如果这样做,你不需要用'inline'注释你的函数,因为编译器只需要函数的主体 - 而不是你的'inline'关键字。现在的编译器很聪明,不用你的提示就能知道是否以及何时内联函数。并且内联并不一定会增加程序的性能,它可能会增加可执行文件的大小。

请参阅Herb Sutter 的这篇文章。他认为关键字“inline”在 C++ 中没有意义。但我不同意他的观点。关键字“内联”有一个区别:您可以在程序中多次指定内联函数的主体(前提是每次定义完全相同)——这在将函数主体放入标头时很有用(如果您需要出于任何原因)。

于 2012-07-11T08:15:49.413 回答
1

Use a separate "implementation header" that you will still include everywhere?

于 2012-07-11T08:03:58.540 回答
1

您只需要指定一次原型或实现。两者都有资格。

于 2012-07-11T08:04:36.453 回答
1

根据定义,内联函数必须在编译时已知。如果要在单独的 .h 文件中定义它们,可以使用

#pragma 一次

只插入一次定义的技巧。

于 2012-07-11T08:04:42.803 回答
0

我发现在一些嵌入式工具链中,函数声明中不允许使用#inline 关键字。您可以在定义中指定它,但是(如上所述)许多编译器无论如何都会忽略该关键字。

于 2015-02-05T21:49:11.983 回答
-2

// 这适用于 g++ 编译器。//计算.h

class Calc
{
    int Sum(int x, int y);
};

//计算.cpp

inline int Calc::Sum(int x, int y)
{
    return (x+y);
}
于 2019-10-28T08:56:01.550 回答