内联展开

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

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

除此之外，内联展开会引入大量冗余代码，需要通过一系列编译优化步骤进行缩减。比如一个记录（或理解为结构体）中的值是不变的，那么可以将其值直接替换到引用处；逻辑上不被使用到的分支代码或者变量，会被自动消除掉；逻辑上不可能进入的分支也可以消除掉。通过这些优化可以极大缩减冗余的代码，使得程序编译后获得较为紧凑的体量。Shrinking Lambda Expressions in Linear Time. Appel & JimShrink Fast Correctly! Oliver & Appel

 參考資料 

Category:編譯器最佳化
Category:子程序