内联函数内部的内联函数

4
以下是该函数的内容:

针对以下函数:

inline void A() {
   ...
   B();
   ...
}

编译器是否也会内联B

如果不是,我应该将B内联以提高性能吗?

4个回答

6
在大多数情况下,您可以放心地将内联决策留给编译器,它会比您更好地知道何时何时不会导致更好的性能。
在这种特定情况下,我强烈怀疑完全由编译器决定该怎么做。

此外,inline关键字只是一个提示或愿望,编译器不一定要遵循它。我敢打赌现代编译器会直接忽略它。 - galinette
取决于编程语言。C99的inline根本不是提示。 - ShadowRanger

5

不,内联关键字只会导致 A 代码嵌入到调用者代码中。这不会影响 B 的内联。

此外,在 C++ 中,内联关键字只是对编译器的提示,编译器可以选择忽略它。现代编译器会决定函数是否需要内联,即使没有使用关键字。


4

一些评论者没有提到的是,有时inline不仅仅是编译器的提示,而是一个必须使用的关键字。当我们在头文件中放置一个非模板函数的定义,并且这个头文件被多个.cpp文件包含时,就会出现这种情况。在这种情况下,如果没有inline,将会触发链接错误。事实上,这是唯一需要输入这6个字符的情况。在其他情况下,编译器将尽可能使用内联 - 不管是否存在这个关键字。


在你提到的情况下,函数是否实际上被内联或者只是使用 inline 解决了链接器错误? - Monster Hunter
1
@MonsterHunter,它保证解决链接错误。但它并不保证实际内联操作的执行。不过别担心,现代编译器非常喜欢内联操作。如果有任何可以进行内联操作的内容,它们一定会被内联处理的 :) - SergeyA

2
当你将一个函数或方法声明为inline时,这只是向编译器发出一个提示,表明这个特定的函数应该被内联。然后编译器会决定是否要将其内联。对于像在A()中调用B()的嵌套调用也是如此。
我可能会将两个函数都添加inline说明符,但这只是一个风格问题 - 像GCC这样的现代优化编译器将自动进行优化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接