使用GCC的C++内联函数 - 为什么要调用CALL?

Geo*_*rge 17 c++ inline tdm-mingw

我一直在用C++测试内联函数调用.

Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)
Run Code Online (Sandbox Code Playgroud)

C++编程语言中的Stroustrup:

内联说明符是编译器的一个提示,它应该尝试生成代码内联,而不是为函数设置一次代码,然后通过通常的函数调用机制调用.

但是,我发现生成的代码根本不是内联的.有一个CALL为instrction 国际广场的功能.

替代文字http://i42.tinypic.com/8ys3f4.jpg

为什么会这样?那我怎么能使用内联函数呢?

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

**** 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
Run Code Online (Sandbox Code Playgroud)

njs*_*jsf 48

就像Michael Kohne所提到的那样,inline关键字总是一个提示,并且在你的函数的情况下GCC决定不内联它.

由于您使用的是Gcc,因此可以强制使用__attribute((always_inline))进行内联.

例:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));
Run Code Online (Sandbox Code Playgroud)

资料来源:GCC内联文档

  • 是的,但如果提问者离开并开始粘贴__attribute __((always_inline)); 在他的所有功能上,而不是仅仅使用-O3编译,我们失败了. (5认同)
  • 同意.我想我仍然是一个乐观主义者,相信大多数人都有一些常识;-) (2认同)

Mic*_*hne 23

没有通用的C++方法来强制编译器创建内联函数.请注意您引用的文本中的"提示"一词 - 编译器没有义务听取您的意见.

如果你真的,绝对必须要做一些内联,你需要一个编译器特定的关键字,或者你需要使用宏而不是函数.

编辑:njsf在他的回复中给出了正确的gcc关键字.


Eur*_*lli 8

您是否正在查看调试版本(禁用优化)?编译器通常会在"调试"版本中禁用内联,因为它们会使调试更加困难.

在任何情况下,inline指定的确是一个提示.编译器不需要内联函数.任何编译器可能决定忽略内联提示的原因有很多:

  • 编译器可能很简单,不支持内联
  • 编译器可能使用内部算法来决定内联和忽略提示的内容.
    (有时,编译器可以比选择内联的内容做得更好,特别是在像IA64这样的复杂架构中)
  • 编译器可能会使用自己的启发式方法来确定尽管有提示,但内联不会提高性能