內聯展開

維基百科,自由的百科全書

內聯展開(或稱內聯,下文或交替使用)是一種將函數體直接展開到調用處的一種優化技術。它可以由手工指定(如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