内联函数的引入是为了“提高程序运行速度”而做的一项改进。
函数在调用的时候,将会使程序跳到另一个地址(函数的地址),并且在函数结束的时候返回。 执行到函数调用指令时,程序将在函数调用后转储该指令的地址,并且将函数参数复制到堆栈,跳转到标记函数起点的内存单元,执行函数代码,然后返回到地址被保存的指令处。在使用函数的时候,来回跳转并记录跳转位置会带来一定的开销。因此,引入了内联函数。
内联函数在编译的时候,将使用相应的函数代码来代替函数调用。这样一来,程序就不用跳转到另一个位置去执行函数代码了(因为已经有副本了)。所以,使用内联函数会使运行速度提升。
但是,使用内联函数是有代价的:
- 内联函数的使用会带来“代码膨胀”的问题,也需要占用更多的内存;
- 对内联函数进行任何修改,都需重新编译。因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。
所以,在使用内联函数前要进行衡量,衡量的准则如下:(之一)
如果函数体内的代码比较长,使得内联将导致内存消耗代价比较高;
如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大;
那么就不宜使用内联函数。
声明内联函数的规则如下(选择其中之一即可!!!):
在函数声明前加关键字inline;
在函数定义前加关键字inline;