我一直在测试 C++ 中的内联函数调用。

Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)

Stroustrup 在《C++ 编程语言》中写道:

内联说明符向编译器暗示,它应该尝试生成内联代码,而不是一次为函数编写代码,然后通过通常的函数调用机制进行调用。

但是,我发现生成的代码根本不是内联的。有一个 称呼 的指示 伊方 功能。

alt text

为什么会发生这种情况?那么我该如何使用内联函数呢?

编辑: 使用的命令行选项:

**** 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),但即使有到虚成员函数这样的关键字虚拟呼叫将不会被内联。

我面临类似的问题,并发现如果内联函数被写入在头文件,它才能工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top