使用 GCC 的 C++ 内联函数 - 为什么要 CALL?
题
我一直在测试 C++ 中的内联函数调用。
Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)
Stroustrup 在《C++ 编程语言》中写道:
内联说明符向编译器暗示,它应该尝试生成内联代码,而不是一次为函数编写代码,然后通过通常的函数调用机制进行调用。
但是,我发现生成的代码根本不是内联的。有一个 称呼 的指示 伊方 功能。
为什么会发生这种情况?那么我该如何使用内联函数呢?
编辑: 使用的命令行选项:
**** Build of configuration Debug for project InlineCpp ****
**** Internal Builder is used for build ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\InlineCpp.o ..\src\InlineCpp.cpp
g++ -oInlineCpp.exe src\InlineCpp.o
解决方案
没有通用的C ++的方式来强制编译器创建内联函数。注意你引用的文字字“提示” - 编译器没有义务听你的
如果你真的,绝对必须做的东西在网上,你需要一个编译器特定的关键字,或者您需要使用宏,而不是功能。
编辑:njsf给出适当的gcc关键字在他的响应
。其他提示
像迈克尔Kohne提到,inline关键字始终是一个提示,而GCC在你的功能的情况下决定不内联了。
由于正在使用的gcc可以强制内嵌在__attribute((always_inline))。
示例:
/* Prototype. */
inline void foo (const char) __attribute__((always_inline));
来源: GCC直列文档
您正在查看调试版本(禁用优化)吗?编译器通常在“调试”构建中禁用内联,因为它们使调试变得更加困难。
无论如何, inline
指定确实是一个 暗示. 。编译器不需要内联该函数。任何编译器可能决定忽略内联提示的原因有很多:
- 编译器可能很简单,并且不支持内联
- 编译器可能会使用内部算法来决定内联内容并忽略提示。
(有时,编译器在选择内联内容方面可以比您做得更好,特别是在 IA64 这样的复杂体系结构中) - 编译器可能会使用自己的启发法来决定,尽管有提示,内联不会提高性能
在线无非是一个建议更多的是,如果有可能内联此功能,则编译器应该考虑这样做的编译器。你的建议一些功能,因为他们是如此简单,它会自动内联等功能的它内联也不会因为他们是复杂的。
另外,我注意到,你在做调试版本。我真的不知道,但它可能是编译器禁用内联的调试版本,因为它使事情困难的调试器...
有一个提示和编译罐选择忽略该提示。我想,我读了一些如该GCC通常忽略它。我听到remeber有一个标志,但它仍然没有的情况下100%的工作。 (I还没有找到一个链路尚未)。
标志:-finline函数在-O3优化电平接通
无论内联要由编译器。是免费忽略的在线的提示。一些编译器有一个特定的关键字(如在VC __forceinline
),但即使有到虚成员函数这样的关键字虚拟呼叫将不会被内联。
我面临类似的问题,并发现如果内联函数被写入在头文件,它才能工作。