4.4 内联函数
4.4.1 内联函数引入的原因
引入内联函数的目的是为了解决程序中函数调用的效率问题。
前面讲过,函数是一种更高级的抽象。它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现;另外,函数的引入可以减少程序的目标代码,实现程序代码和数据的共享。但是,函数调用也会带来降低效率的问题,因为调用函数时实际上是将程序执行顺序转移到函数所存放在内存中的某个地址;将函数的程序内容执行完后,再转回到原先执行该函数前的地方。这种转移操作要求在转去前保护现场并记录执行的地址,转回后先要恢复现场,并按原来保存的地址继续执行。因此,函数调用会有一定的时间和空间方面的开销,这将影响其效率。特别是对于一些函数体代码不是很大,但又频繁被调用的函数来说,解决其效率问题更为重要。引入内联函数实际上就是为了解决这一问题。
使用内联函数,编译器会在程序中用函数体代码直接替换函数调用,不需要在运行时进行函数跳转。这样做在时间和空间上的开销不会像普通函数调用时那么大,因此,可以显著提高程序的运行效率。
4.4.2 内联函数的定义方法
内联函数的定义方法很简单,只要在函数定义的函数头前面加上 inline
关键字。内联函数的定义方法与一般函数一样。例如:
inline int add_int(int x, int y, int z) {
return x + y + z;
}
其中,inline
是关键字。函数 add_int()
是内联函数。
例4.13 编程求1~10中各个数的平方:
#include <iostream.h>
inline int power_int(int x) {
return (x) * (x);
}
void main() {
for(int i = 1; i <= 10; i++) {
int p = power_int(i);
cout << "The square of " << i << " is " << p << endl;
}
}
该程序中,函数 power_int
是个内联函数,其特点是该函数在编译时被替代,而不是像一般函数那样在运行时被调用。这样,程序在执行过程中就没有了函数调用的开销,从而提高了运行效率。该程序的结果请读者自己分析。
4.4.3 使用内联函数应注意的事项
虽然内联函数具有许多优点,但在使用内联函数时应注意如下几点:
- 在内联函数内不允许使用循环语句和开关语句,否则将按非内联函数处理。
- 内联函数的定义必须出现在内联函数第一次被调用之前。
- 类结构中所有在类体内定义的成员函数都是内联函数。
在使用内联函数时,应根据具体情况权衡其带来的好处和限制,合理使用内联函数以提高程序的运行效率。