上QQ阅读APP看书,第一时间看更新
6.4 内联函数
函数的引入可以减少程序的目标代码,实现程序代码的共享。但是,函数调用也需要一些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调函数中,被调函数的程序代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数,这种开销可以忽略不计,但是对于一些函数体代码很短,但又被频繁地调用的函数,就不能忽视这种开销。引入内联函数正是为了解决这个问题,提高程序的运行效率。
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将函数体中的代码替代到程序中,因此会增加目标程序的代码量,进而增加空间开销,而在时间开销上不像函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省的。
提示
在内联函数内不允许用循环语句和开关语句。内联函数的定义必须出现在内联函数第一次被调用之前。
下面通过一个实例来说明如何使用内联函数。
【实例6-9】内联函数(代码6-9.txt)
新建名为“inlinetest”的【C++ Source File】源程序,源代码如下所示:
【代码详解】
在该例中,首先使用inline声明了一个内联函数dbtest,用来判断参数为奇数还是偶数;在主程序中,使用for循环输出1~10,分别调用dbtest函数,将结果输出;定义dbtest函数,如果a模2大于0,就为奇数,否则为偶数。
运行结果如图6-10所示。
图6-10 代码运行结果
【实例分析】
从运行结果来看,将1~10的奇偶性都输出。在编译时,主程序调用dbtest的时候,将dbtest的内容整个都复制到那里,不需要每次都调用函数,然后返回。虽然浪费了空间开销,但是却节省了大量的时间开销。