


本文主要介绍内联替换。实验环境是CentOS7 + GCC。
1. 优化方法简述
普通函数的调用过程为保存现场、转到被调函数执行、执行完毕返回调用处、恢复现场四个步骤,而调用过程中会产生部分时空开销。内联替换就是将函数调用处直接替换为函数体,减少函数调用的开销。通过内联替换优化使得程序的过程间分析和优化工作能够直接调用过程内的相应方法实现,提供了更多并行的机会,进而提高了程序执行效率。
但并不是所有的内联替换都会得到进一步的优化。内联一般只针对小型或被频繁调用的函数,内联较大的函数或过度内联会增大一个过程内的代码量,进而导致寄存器压力增大、读取指令延迟及编译时间开销增加,并且内联替换后会增加数据相关性分析的复杂度,导致某些程序并行性不能得到很好地发掘。因此,过度内联有时并不能得到更好的优化结果,需要优化人员进行平衡。
2. 示例分析
对程序进行内联替换,将函数调用处直接替换为函数体,在某些情况下可以减少函数调用的开销。左边给出了示例优化前代码inlineRep1.cpp,右边给出了示例优化后代码inlineRep2.cpp。

编译运行命令:
(1)gcc inlineRep1.cpp -o inlineRep1
(2)./inlineRep1
(3)gcc inlineRep2.cpp -o inlineRep2
(4)./inlineRep2

优化前后,代码的执行结果都是正确的,但优化后代码的执行时间要比优化前代码的执行时间短。将函数调用处直接替换为函数体,可以在一定程度上缩短程序的执行时间。
汇编代码生成命令:
(1)gcc -S inlineRep1.cpp -o inlineRep1.s
(2)gcc -S inlineRep1.cpp -o inlineRep1.s

3. 总结
内联替换就是将函数调用处直接替换为函数体,减少函数调用的开销。但并不是所有的内联替换都会得到进一步的优化。过度内联有时并不能得到更好的优化结果,需要优化人员进行平衡。
4. 参考资料
(1)内联函数_用内联函数求两个数的乘积-CSDN博客
(2)内联函数调用方式 - 百度文库 (baidu.com)


