目录
1 inline 与 constexpr 函数
1.1 内联函数
在函数签名的返回值类型前加上关键字inline
,指示编译器将此函数作为内联函数,即在每个调用它的地方将其“内联地”展开(可以理解为在调用它的地方将调用函数代码替换为函数内部的实现代码)。常常将需要频繁调用且规模较小的轻量函数定义为内联函数,其意义如下:
- 对于实现轻量操作的小函数而言,将其内部的轻量操作封装为一个小函数,而不是在需要执行这些轻量操作的地方直接写操作本身的代码,有利于程序的封装和复用。
- 但如果这种封装的小函数只是普通的函数,而程序中需要对其频繁调用。因为函数调用隐式地包含了很多耗费资源的额外工作(如传参初始化形参临时对象等),因此在频繁调用的情景下会造成不必要的资源浪费。
- 定义为内联函数,既满足了封装性,又避免了实际调用时带来的资源损耗。
需要注意两点:
- 在函数签名中声明
inline
只是向编译器发出内联展开的请求,编译器可以根据情况忽略这个请求。一般不支持内联递归函数,且一个75行以上的函数也不大可能在调用点内联展开。- 除了显式地声明 inline外,还存在隐式内联函数。当类的一个成员函数在类内声明处定义时,编译器就会将其自动地优化为内联函数,这就是典型的隐式内联。
范例:
//内联版本的shorterStr函数(返回两个string对象中较短的那个)
inline const string & shorterStr(const string &s1, const string &s2) {
return s1.size() <= s2.size() ? s1 : s2;
}
int main() {
string s1 = "aaaa", s2 = "bb";
cout << shorterStr(s1, s2) << endl; //由于shorter是内联函数,在编译过程中,此语句被编译器展开为以下的形式:
cout << s1.size() <= s2.size() ? s1 : s2; << endl;
}
class Array {
public:
void func() {
//在类内声明处定义,此函数隐式内联
cout << "Array func" << endl;
}
void func1(); //func1在类内声明,类外定义
inline void func2(); //func2在类内显式声明为内联函数,类外定义
void func3(); //func3在类内没有显式声明为inline,在类外定义时追加inline
};
void Array::func1() {
//func1在类内声明,类外定义,不会隐式自动优化为内联函数
cout << "Array func1" << endl;
}
void Array::func2() {
//func2在类内显式声明为内联函数,类外定义,编译器会在调用func2时尝试将其内联展开
cout << "Array func2" << endl