函数的引入可以减少程序的目标代码,实现程序代码的共享。
函数调用需要时间和空间开销,调用函数实际上将程序执行流程转移到被调函数中,被调函数的代码执行完后,再返
回到调用的地方。这种调用操作要求调用前保护好现场并记
忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但对于一
些函数体代码很短,又被频繁调用的函数,就不能忽视这种
开销。这个时候就需要引入内敛函数来解决这个问题,提高程序的运行效率。
我们先来看下面的函数:
double Average(double total, int number)
{
return total/number;}
定义这么简单的函数有必要吗?实际上,它还是有一些优点的:第一,它使程序更可读;第二,它使这段代码可以重
复使用。
但是,它也有缺点:当它被频繁地调用的时候,由于调用函数的开销,会对应用程序的性能(时间+空间效率,这儿特
指时间)有损失。
例如,Average在一个循环语句中重复调用几千次,会降低程序的执行效率。
为了解决上面的问题,我么可以把它定义为内敛函数的形式:inline double Average(double total, int number)
{
return total/number;}
这样就可以提高程序的运行效率。
内敛函数一般规模较小,程序再调用这些成员函数时,不是真正的执行函数的调用过程(如保存返回地址等处理),
而是把函数代码嵌入程序的调用点(内敛函数在源文件中不是调用而是按原样展开),这样可以大大减少调用成员函
数的时间。内敛函数是提高运行时间效率,但却增加了空间开销。即内敛函数目的是:为了提高函数的执行效率
(速度)。
从定义上看内敛函数似乎和宏函数有些相像,但是我们需要记住内敛函数与宏函数的本质区别:
在C中可以用宏函数提高执行效率,宏函数不是函数但使用起来像函数,编译器用复制宏函数的方式取代函数调用,
省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高速度。
而内敛函数是通过编译器控制来实现的。而且内敛函数是真正的函数,只是在需要用到的时候,内敛函数像宏一样的
展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内敛函数,而不必担心会产生
于处理宏的一些问题。
还有最重要的一点是宏函数是用编译时间换内存空间,而内敛函数是用内存空间换执行时间。
使用内联函数时应注意以下几个问题:
(1) 在一个文件中定义的内敛函数不能在另一个文件中使用。它们通常放在头文件中共享。
(2) 内敛函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内敛函数。(3) 内敛函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把
该函数作为非内敛函数处理。
(4) 内敛函数要在函数被调用之前声明。
例如:
#include <iostream.h>int increment(int i);
inline int increment(int i)
{
i++;
return i;
}void main(void)
{
……
}
如果我们修改一下程序,将内敛函数的定义移到main()之后:
#include <iostream.h>int increment(int i);
void main(void)
{
……
}
//内敛函数定义放在main()函数之后
inline int increment(int i)
{
i++;
return i;
}内敛函数在调用之后才定义,这段程序在编译的时候编译器不会直接把它替换到main中。也就是说实际上"increment(int i)"只是作为一个普通函数被调用,并不具有内敛函数的
性质,无法提高运行效率。