我需要定义内联函数来提高我的代码的性能。目前函数声明在.h文件中,定义在.cpp文件中。我在每个函数声明的前面添加了inline关键字,但是我收到了链接错误。是否可以分离内联函数的声明和定义?是否可以分离内联函数的声明和定义?
回答
使用一个单独的“实现标题”,您仍将包含在任何地方?
您只需要指定一次原型或实现。两者都符合资格。
根据定义,在编译时必须知道内联函数。 如果你想在一个单独的.h文件中定义它们,你可以使用一个
的#pragma一次
把戏只能插入自己定义一次。
是的,但你必须把实现放在头文件中。这是因为为了不加标题,在包含标题时必须知道定义。
如果这样做,即使没有inline
关键字,现代编译器也会自动内联函数。
你可以单独声明和定义罚款,但该定义必须在使用该功能的每个翻译单元提供,例如:
#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基本上说,它必须是相同的无处不在,甚至超负荷的决议等
尼特:...在每个翻译单元_that使用内联函数_。 (严格来说,odr-uses) – 2012-07-11 08:19:35
@CharlesBailey - 好点,因为原本措辞我有一个意想不到的意义,修复我希望现在。 – Flexo 2012-07-11 08:24:58
你绝对确保让你的函数“内联”会提高你的表现?我很确定它不会。
编译器能够内联一些函数调用,当且仅当它可以看到内联函数的主体。所以你需要包含函数的主体,但是如果这样做,你不需要用'inline'来注释你的函数,因为编译器只需要函数的主体 - 而不是你的'inline'关键字。现在的编译器很聪明,并且知道是否以及何时内联函数。内联并不一定会提高程序的性能,而且很可能会增加可执行文件的大小。
见Herb Sutter的this article。他认为关键字“inline”在C++中没有意义。但我不同意他的看法。关键字“inline”有一个区别:你可以在程序中不止一次地指定内联函数的主体(假设它每次都是完全相同的定义) - 当把函数体放入标题时这很有用(如果你需要的话这是出于任何原因)。
我发现在一些嵌入式工具链中,函数声明中不允许使用#inline关键字。你可以在定义中指定它,但是(如上所述),许多编译器无论如何都会忽略关键字。
- 1. 动态库中定义的小函数是否可以内联?
- 2. 内联的定义和声明
- 3. 在.h和.cpp文件中分隔定义和声明时,是否可以内联getter和setter?
- 4. 函数声明和定义
- 5. 是否可以重写内联函数?
- 6. 是否可以在函数范围内声明/实现模板?
- 7. 为什么函数的定义与声明分离?
- 8. 声明和定义类成员函数内的函数对象
- 9. 是否可以将此SQL联合声明分解?
- 10. 是否可以使用css3声明js事件和/或函数?
- 11. 是否可以在TypeScript中声明和调用函数字典?
- 12. 内部函数声明是否安全?
- 13. SFINAE消除,Constexpr和函数模板:我可以保持声明和定义分离吗?
- 14. 是否可以在函数调用方中声明关联数组?
- 15. 是否可以在REPL中定义固定声明?
- 16. C++用静态内联声明模板函数是否有意义?
- 17. 函数定义中的函数声明
- 18. C++内联函数调用函数可以在头文件后面声明吗?
- 19. 风格:内联函数声明中
- 20. 如何显式声明内联函数?
- 21. 是否可以制作自定义的renderscript内在函数?
- 22. 我如何可以声明内定义的函数的类型让
- 23. 函数定义声明函数吗?
- 24. 函数声明/函数定义
- 25. 用于C++模板的声明和定义分离
- 26. Objective-C消息是否存在方法声明/定义分离的等价物?
- 27. 是否可以在接口中声明一个私有函数?
- 28. 是否可以在GSP中声明一个函数?
- 29. 源文件中定义的方法是否可以内联?
- 30. 定义一个调用其他函数的内联函数是否有意义?
这是某种仅限于Windows的技巧吗? – 2012-07-11 10:11:51
不仅 请参阅http://en.wikipedia.org/wiki/Pragma_once 它可以让你不必像#ifndef __MYHEADERH__ #define __MYHEADERH__等... – 2012-07-11 10:51:31