内联函数是C++为提高程序运行速度所做的一项改进。常规函数和内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。
当程序执行函数调用时,系统要为即将调用的函数创建栈空间(栈帧),保存现在正在执行的函数数据(保护现场),传递参数以及控制程序执行的跳转等操作,当调用的函数执行完成后又需要跳到当前函数并恢复现在的数据(恢复现场),然后继续执行,这些操作都需要时间和空间开销。
C++内联(inline)函数提供了另一种选择,对于内联函数编译器将用函数代码替换函数调用,这样程序就无需跳到另一个函数执行,执行完后再跳回来。因此内联函数的运行速度比常规函数稍快。
例如:求两个数的最大值。
#include <iostream>
using namespace std;inline int max(int x,int y) //定义内联函数
{return x>y?x:y;
}int main()
{int z1,z2,z3;z1=max(10,20); //调用函数,在编译时进行代码替换z2=max(20,50); //调用函数,在编译时进行代码替换z3=max(z1,z2);//调用函数,在编译时进行代码替换cout<<"z1="<<z1<<endl;cout<<"z2="<<z2<<endl;cout<<"z3="<<z3<<endl;return 0;
}
上面程序中,main()函数3次调用了内联函数max(),将在编译过程中展开类似下面的形式:
int z1=10>20?10:20;
int z2=20>50?20:50;
int z3=z1>z2?z1:z2;
程序员请求将函数作为内联函数时,编译器不一定满足这种要求。内联inline只是对编译器提出建议,而有的编译器没有启用或者实现这种特性。一般 内联函数应该满足下面的要求:
●函数不能出现循环;
●函数代码不超过三行。
类中的内联函数
内联函数主要的应用场景就是类。如果类的成员函数非常简单(不超过三行代码),可以将成员函数定义在类中,这时该函数自动成为内联函数,如果成员函数较复杂(超过三行),则在类中声明成员函数,而在类外定义。
内联和宏
inline是C++新增的特性。C语言使用预处理语句#define来实现宏。宏最常用的功能是让数字有自己的名字。而不是让它做函数该做的事情。下面是一个计算平方的宏:
#define SQUARE(x) x*x
宏仅仅是字符替换。下面的语句执行结果可能和你想的并不一样。
int a = 1;
int b = SQUARE(2+3);//被替换成 int b=2+3*2+3 ;
int c = SQUARE(++a);//被替换成 int c=++a*++a ;这个a被++两次
这里的目的不是演示如何编写宏,而是要指出,C语言中的宏仅仅只是字符替换,如果要让宏执行类似函数的功能,请考虑把它改为内联函数。