函数何时应该内联?
When should a function be inline or not?
假设我在头文件中声明了以下类,并swap
了一个友元函数:
// header.h
class myClass
{
friend void swap(myClass &, myClass &);
public:
myClass(int ii = 0) : i(ii) {}
private:
int i;
};
现在我想定义swap
.如果我稍后在同一个头文件中定义它,就像这样,
inline void swap(myClass &a, myClass &b)
{
using std::swap;
swap(a.i, b.i);
}
一切都很好。但是,如果我删除inline
说明符,则会出现错误。
现在假设我想在单独的实现文件中定义swap
。如果我这样定义它,
// impl.cc
#include "header.h"
void swap(myClass &a, myClass &b)
{
using std::swap;
swap(a.i, b.i);
}
一切都很好。但是现在,如果我添加inline
说明符,则会出现错误。
为什么一个版本需要inline
而另一个版本不能有?
来自C++标准(9.1.6 内联说明符)
6如果内联函数或变量在翻译单元中使用, 从该译文的末尾可以得出它的定义 单位,并且在每个这样的定义中应具有完全相同的定义 翻译单元(6.2)。[注意:对内联函数的调用或使用 的内联变量在其定义之前可能会遇到 显示在翻译单元中。—尾注] 如果定义 函数或变量在其第一个点上可访问 声明为内联,程序格式不正确。如果函数或 具有外部或模块链接的变量在 One 中内联声明 翻译单元,所有翻译单元中应有一个可访问的内联声明 声明它的翻译单位;无需诊断。 具有外部或模块链接的内联函数或变量应 在所有翻译单元中具有相同的地址。[注意:静态本地 内联函数中的变量始终具有外部或模块链接 指同一对象。在内联主体中定义的类型 带有外部或模块链接的功能在每个 翻译股。—尾注]
因此,要么在标头中将 friend 函数声明为内联函数,以便可以在使用它的每个翻译单元中访问其定义。或者该函数是非内联函数,其定义应放置在一个编译单元中以满足一个定义规则。
相关文章:
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 何时应在构造函数参数中使用 const C++?
- 何时使函数成为类成员函数C++?
- 何时在函数中声明堆栈分配变量?
- 为什么或何时应在调用之前将可调用函数参数强制转换为右值?
- 点云库 (PCL) - 声明点云时何时应使用 ::P tr 的经验法则?
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 记录器何时应刷新
- 何时应使用 [[maybe_unused]]
- 何时应在现代C++中使用(非标头)源文件
- 何时应使用模板化参数与构造参数
- 关键部分或静音是否真的是成员变量,或者何时应成为成员变量
- 何时应存储指向函数的引用或指针?
- 何时应在Qt中将子对象声明为其父类的成员变量
- 何时应找到附加到模型的边界框的最小值和最大值
- 何时应删除默认的移动构造函数时令人困惑的事情
- 何时在函数调用中发生临时对象的破坏
- 何时应通过常量引用传递运算符重载函数的参数
- 何时应在非成员函数之前编写关键字 'static'?
- 何时应使用内联函数