c ++中的内联函数 - 条件

时间:2012-06-02 10:06:11

标签: c++

在什么条件下内联函数不再是内联函数并且作为任何其他函数?

3 个答案:

答案 0 :(得分:7)

神话:
inline只是编译器可能会或可能不会遵守的建议。一个好的编译器无论如何都会做需要做的事情。

真相:
inline通常向实现指示在调用点处函数体的内联替换优先于通常的函数调用机制。在呼叫点执行此内联替换不需要实现;但是,即使省略此inline替换,也会遵循inline的其他规则(尤其是 一个定义规则)。

  

在什么情况下inline函数不再是inline函数并且可以作为任何其他函数使用?

鉴于引用的事实,这个问题有更深层次的背景。

当您将函数声明为static inline函数时,该函数的行为与任何其他static函数一样,并且关键字inline不再重要,它变得多余。

函数上的static关键字强制inline函数具有内部链接。( inline函数具有外部链接) 这种函数的每个实例都被视为一个单独的函数(每个函数的地址不同),并且这些函数的每个实例都有自己的静态局部变量和副本的副本。字符串文字( inline函数只有这些的一个副本。

答案 1 :(得分:1)

由编译器自行决定。

但是有些案例无法内联,例如:

  • 递归函数
  • 地址被引用到某处的函数
  • 虚拟功能(有一些例外情况)

答案 2 :(得分:1)

这取决于编译器优化。

不同的编译器有不同的规则来提高代码的效率。但是如果你将一个函数声明为内联函数,只要没有一个规则说明不同,编译器就会倾向于尊重你的决定。

请记住,编译器可以完全更改方法的执行路径。例如,考虑下一种情况:

int MyClass::getValue()
{
  return someVariable;
}

在编译时,将此类函数声明为内联与否之间几乎没有区别。编译器可能会将属性部分公开并编码:

myInstance->getValue()

作为

myInstance->someVariable

在大多数情况下,这更像是一种美学决定。