内联函数中的内联函数
inline functions within an inline function
对于以下函数:
inline void A() {
...
B();
...
}
B 是否也被编译器内联了?
如果不是,我是否应该使 B 内联以提高性能?
在大多数情况下,您可以高枕无忧,将内联决定留给编译器,编译器会比您更清楚什么时候和什么时候不这样做会带来更好的性能。
在这种特定情况下,我强烈怀疑它完全取决于编译器。
不,内联关键字只会导致A代码内联到调用者代码中。这不会影响 B 的内联。
除此之外,在c++中,inline关键字只是对编译器的提示,允许忽略。现代编译器决定何时需要内联函数,即使没有使用关键字。
当您声明 function/method inline
时,它只是向编译器 提示 应该内联此特定函数。然后编译器可能会也可能不会内联它。这同样适用于嵌套调用,例如在 A()
.
中调用 B()
我可能会向这两个函数添加 inline
说明符,但这只是风格问题 - 像 GCC 这样的现代优化编译器无论如何都会对其进行优化。
不知怎的,所有的评论者都没有提到在某些情况下内联不仅仅是对编译器的提示,而是一个强制性的关键字。当将函数的非模板定义放在多个 .cpp 文件包含的头文件中时,就会发生这种情况。在这种情况下,缺少内联将触发链接器错误。事实上,这是唯一需要费心输入这 6 个字符的情况。在其他情况下,编译器将尽可能地内联所有内容 - 无论此关键字是否存在。
对于以下函数:
inline void A() {
...
B();
...
}
B 是否也被编译器内联了?
如果不是,我是否应该使 B 内联以提高性能?
在大多数情况下,您可以高枕无忧,将内联决定留给编译器,编译器会比您更清楚什么时候和什么时候不这样做会带来更好的性能。
在这种特定情况下,我强烈怀疑它完全取决于编译器。
不,内联关键字只会导致A代码内联到调用者代码中。这不会影响 B 的内联。
除此之外,在c++中,inline关键字只是对编译器的提示,允许忽略。现代编译器决定何时需要内联函数,即使没有使用关键字。
当您声明 function/method inline
时,它只是向编译器 提示 应该内联此特定函数。然后编译器可能会也可能不会内联它。这同样适用于嵌套调用,例如在 A()
.
B()
我可能会向这两个函数添加 inline
说明符,但这只是风格问题 - 像 GCC 这样的现代优化编译器无论如何都会对其进行优化。
不知怎的,所有的评论者都没有提到在某些情况下内联不仅仅是对编译器的提示,而是一个强制性的关键字。当将函数的非模板定义放在多个 .cpp 文件包含的头文件中时,就会发生这种情况。在这种情况下,缺少内联将触发链接器错误。事实上,这是唯一需要费心输入这 6 个字符的情况。在其他情况下,编译器将尽可能地内联所有内容 - 无论此关键字是否存在。