条件中的内联函数

Inline functions in conditions

本文关键字:函数 条件      更新时间:2023-10-16

在什么情况下,内联函数不再是内联函数,而是像任何其他函数一样工作?

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

真相:
inline通常向实现指示,在调用点对函数体进行内联替换比通常的函数调用机制更可取。在调用点执行此内联替换不需要实现;但是,即使省略了此inline替换,也会遵循inline的其他规则(尤其是w.r.t一个定义规则)。

在什么条件下,inline函数不再是inline函数,而像任何其他函数一样起作用?

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

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

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

这由编译器自行决定。

但有些情况就是无法内联,例如:

  • 递归函数
  • 地址在某处引用的函数
  • 虚函数(有一些例外的想法)

这取决于编译器的优化。

不同的编译器有不同的规则,以使代码更高效。但是,如果您将一个函数声明为内联函数,编译器倾向于尊重您的决定,只要它的规则都没有说不同。

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

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

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

myInstance->getValue()

myInstance->someVariable

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