一、概述
- 正常函数调用时将程序执行权转到被调用函数中,执行结束后再返回调用它的函数中,需要经历:
a) 在栈中为形参和局部变量分配存储空间;
b) 把实参值复制给形参;
c) 把函数返回地址放入栈中,以便函数结束后知道应该回到程序的哪个位置继续执行;
d) 跳转到函数内部执行;
e) 函数执行结束后从栈中回收形参和局部变量占用的存储空间;
f) 从栈中取出返回地址,跳转到该地址, 并将执行控制权返回给调用它的函数。以上调用过程产生开销并消耗时间。
- 内联函数解决的问题:对于小型的函数,可能调用函数实现程序执行权转换的过程比函数体代码运行的时间还要长。但是从程序逻辑设计角度看,实现单独功能的代码块写成函数更加清晰,即便函数较小。
内联函数就是为解决以上问题/矛盾而生的。
通过将函数设置成内联函数,内联函数在调用时将调用表达式用内联函数体替换,而不像一般的函数调用那样将程序执行权转到被调用函数中,从而节省函数调用的时间。其代价是需要占用内存,因此适合规模小(~10行左右的)、流程直接、调用频繁的函数。一般内部含有循环的函数不适合定义成inline的。
二、使用方法
inline是“用于实现”的关键字,必须放在函数定义中才起作用。在函数声明处加不加inline关键字都可以,一般不加,因为用户无需关注是否是inline的。
inline关键字放在返回类型之前。
2.1 直接在函数的声明或定义前加inline关键字。
inline double square(double x){return x*x;}
int main()
{
a = square(5.0);
}
2.2 将类的成员函数定义为inline的:
class Test {
public:
Test(double input) { member = input; } //定义在类内的函数时默认inline的
double explicit_inline( double input2 );
private:
double member;
};
inline double Test::double explicit_inline( double input2 ) { return member; } //在类外定义函数时添加inline关键字,显示inline
a) 定义在类内的成员函数是自动inline的
b) 方法a没有做到接口和实现分离,使得类的声明看起来不够简洁,没有隐藏成员函数的实现细节,因此,通过在类外部定义函数的地方添加inline关键字实现显式inline。
2.3 将函数模板定义为inline的
inline关键字仍然放在返回类型之前,并且放在模板参数列表之后。
template <typename T> inline T max(const T&, const T&);