内联展开

将函数体展开至调用处的一种优化技术

内联展开(或称内联,下文或交替使用)是一种将函数体直接展开到调用处的一种优化技术。它可以由手工指定(如inline关键字),或者经由编译优化自动完成。内联展开类似于宏展开,区别在于内联展开在编译时完成,而宏展开则可能在预编译(如C/C++)、编译时(如Scheme)、运行时(如Scheme)时完成。

内联是一种重要的优化技术。内联的好处主要在于消除函数的调用开销(压栈,保护/恢复现场),但内联展开对于性能的提升不能一概而论,它可能导致生成的代码体积膨胀,并且影响指令缓存的命中率。有研究表明函数内联展开在缓存小的时候能提升性能,缓存较大的时候性能有可能下降[1]

除此之外,内联展开会引入大量冗余代码,需要通过一系列编译优化步骤进行缩减。比如一个记录(或理解为结构体)中的值是不变的,那么可以将其值直接替换到引用处;逻辑上不被使用到的分支代码或者变量,会被自动消除掉;逻辑上不可能进入的分支也可以消除掉。通过这些优化可以极大缩减冗余的代码,使得程序编译后获得较为紧凑的体量。[2][3]

参考资料

  1. ^ The Effect of Code Expanding Optimizations on Instruction Cache Design. Chen, Chang, et al. In abstract: “Function inline expansion improves the performance for small cache sizes, but degrades the performance of medium caches.“
  2. ^ Shrinking Lambda Expressions in Linear Time. Appel & Jim
  3. ^ Shrink Fast Correctly! Oliver & Appel