1、先说基本原则:
①当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.
②一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!
2、内联一定会增加代码量吗?
不一定!
因为函数调用是需要开销的(函数调用时的参数压栈、栈帧开辟与销毁、以及寄存器保存与恢复等等操作),如果说函数本身的代码量比较小,比函数调用时做的准备工作的代码还要小,那此时如果使用内联的话,肯定比不使用内联的代码量还要小[2]。
不过如果函数的代码量稍大,通常还是会增加代码量的,因为内联函数是在编译阶段被编译器展开在调用处的,多次调用就需要多段重复的代码放在各个调用处。对于非内联函数,只需要保存一份函数体的代码,然后进行调用就好了。所以,在空间上,一般来说使用内联函数会导致生成的可执行文件变大。
3、使用内联函数后对于程序的性能会产生什么影响?
首先,大家都知道现在计算机的存储结构,这里只考虑高速缓存到内存这一部分,从高到低,每一级的访问时间近似以成千倍甚至更高的增加。
其次,高速缓存的大小是很小的(对于我们运行的程序来说),所以我们的数据不可能都被装载到高速缓存中,这就引出了一个命中率的问题。在不命中的时候,就需要向更为下层的存储结构寻找索取目标数据,宝贵的时间也因此不断大幅增加。正如我们前面所说,内联使用不当会导致编译出来的执行程序中的text