条件中的内联函数
Inline functions in conditions
在什么情况下,内联函数不再是内联函数,而是像任何其他函数一样工作?
神话:
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
因此,在大多数情况下,这更像是一个美学决定。
- 条件constexpr函数
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- compare_exchange C++函数如何确定竞争条件?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 函数指针与条件分支
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- 如何将条件传递给 C++ 中的函数?
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 如何使一个函数具有三种不同的输出条件?
- 为什么我不能将 size() 函数编写为 while 循环中的条件?
- C++成员函数的条件模板类定义
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 智能指针析构函数争用条件
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- 初始化数据成员取决于构造函数中的条件
- 对基构造函数的条件调用
- 是否可以编写C++不使用任何条件语句交换输入的函数?
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 构造函数的Constexpr条件