1. 节省开销
为了方便理解Inline的优势,先介绍一下函数调用的主要过程:
- 将参数推到堆栈。
- 将返回地址推到堆栈中。
- 在被调用函数中,准备函数的返回值。
- 将调用函数时推入堆栈的参数和返回地址推出。
以上的调用步骤不需要完全理解,只需记住函数调用会给CPU带来一定的开销,而这些开销可以通过Inline函数缓解。因为不同于普通的函数调用,Inline函数在编译过程中会把函数中的代码直接插入正文位置,从而能减少传参和返回的开销,提升程序运行的效率。下边我们进入正文。
2. Inline函数介绍
2.1 Inline函数的定义
Inline函数(翻译为内联函数)的定义:一种编程语言结构,用来建议编译对一些特殊函数进行内敛扩展;也就是说建议编译器将指定的函数体插入并取代调用该函数的地方,从而节省了每次调用函数带来的额外时间开支。(摘自维基百科)
乍一听,这个所谓的内联函数跟之前C中经常使用的宏有很相似,但在实际使用上还有有巨大区别的。与宏定义不同,Inline函数还具有函数的参数类型检查,以及编译检查。
2.2 Inline函数的写法
在函数的声明(定义)前加上 Inline 关键字即可把函数变为Inline函数。如下变的plusOne函数。
#include <iostream>
inline int plusOne(int t){return ++x;};
int main(){
int a = 1;
cout << "a= "<< plusOne(a) << endl;
//上边的语句等效为:cout << "a= "<< ++a << endl;
return 0;
}
对于类的成员函数中,只需在头文件中写出Inline函数的声明和定义即可。下边的例子中,setColor和getColor便是Ball类的Inline成员函数,相当于直接读/写成员变量color。
class Ball{
int color;
public:
Ball(){}
~Ball()
inline void Ball::setColor(int a){ this->color = a };
inline int Ball::getColor(){ return this->color };
};
3. Inline函数的使用
Inline的优点是提升代码执行效率,但同时会造成代码量的增加,是一种以空间换时间的权衡。但是在大多数场景,空间不会是问题。另外,Inline与宏相比更加安全,所以在C++中应该尽量使用Inline来替代宏的使用。
Inline or not?
建议使用Inline函数的场景:
1. 函数 2-3行。
2. 频繁被调用的函数,比如在循环中。
反之,如果函数超过20行,或者有递归调用的话,是不建议使用Inline函数的。