2012-07-11 79 views
4

我需要定义内联函数来提高我的代码的性能。目前函数声明在.h文件中,定义在.cpp文件中。我在每个函数声明的前面添加了inline关键字,但是我收到了链接错误。是否可以分离内联函数的声明和定义?是否可以分离内联函数的声明和定义?

回答

1

使用一个单独的“实现标题”,您仍将包含在任何地方?

1

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

1

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

的#pragma一次

把戏只能插入自己定义一次。

+0

这是某种仅限于Windows的技巧吗? – 2012-07-11 10:11:51

+0

不仅 请参阅http://en.wikipedia.org/wiki/Pragma_once 它可以让你不必像#ifndef __MYHEADERH__ #define __MYHEADERH__等... – 2012-07-11 10:51:31

1

是的,但你必须把实现放在头文件中。这是因为为了不加标题,在包含标题时必须知道定义。

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

4

你可以单独声明和定义罚款,但该定义必须在使用该功能的每个翻译单元提供,例如:

#include <iostream> 

inline void foo(); 

int main() { 
    foo(); 
} 

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

是完全合法的,正确的。


从n3290§7.1.2.4确切的报价是:

内联函数必须在每一个翻译单元中,它是ODR-使用,而且必须具有完全相同 相同的定义中定义每个案例(3.2)。 [注意:在翻译单元中出现 定义之前,可能会遇到对内联函数的调用。末端注]

凡§3.2基本上说,它必须是相同的无处不在,甚至超负荷的决议等

+1

尼特:...在每个翻译单元_that使用内联函数_。 (严格来说,odr-uses) – 2012-07-11 08:19:35

+0

@CharlesBailey - 好点,因为原本措辞我有一个意想不到的意义,修复我希望现在。 – Flexo 2012-07-11 08:24:58

2

你绝对确保让你的函数“内联”会提高你的表现?我很确定它不会。

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

见Herb Sutter的this article。他认为关键字“inline”在C++中没有意义。但我不同意他的看法。关键字“inline”有一个区别:你可以在程序中不止一次地指定内联函数的主体(假设它每次都是完全相同的定义) - 当把函数体放入标题时这很有用(如果你需要的话这是出于任何原因)。

+0

好的答案 - 我会说关键字'inline'在C++中有一个含义和用法,但它与编译器对同名的优化无关。 – Flexo 2012-07-11 08:25:48

+1

+1为链接到药草 – triclosan 2012-07-11 08:45:47

0

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

相关问题