編譯器

關於函式行內展開(inline expansion)的優點與缺點,下列組合何者正確?

  1. A優點是程式碼變小,缺點是呼叫的開銷增加
  2. B優點是編譯能更快完成,缺點是執行結果會改變
  3. C優點是呼叫的開銷消失,缺點是程式碼變大
查看答案與解析

正確答案:C. 優點是呼叫的開銷消失,缺點是程式碼變大

行內展開會把函式主體嵌入取代呼叫,因此引數傳遞、分支與返回的開銷都消失了。此外,呼叫端的常數等會傳到主體中,使常數摺疊與無用程式碼刪除得以生效,這是很大的優點。另一方面,每次呼叫都會產生一份主體的副本,程式碼因此變大,指令快取的未命中也可能增加,所以會挑選小型函式或經常被呼叫的函式來進行。只要正確進行,執行結果不會改變。

  • A. 程式碼反而會變大,呼叫的開銷則會減少。
  • B. 只要正確進行,執行結果不會改變。
  • C. 正確。呼叫開銷消失、最佳化範圍擴大,但程式碼會變大。
練習這個領域 前往領域頁面

編譯器的其他題目

  1. 關於迴圈展開(loop unrolling)的主要效果,下列何者正確?
  2. 在上方迴圈中,哪個計算會成為迴圈不變運算式搬移(搬到迴圈外)的對象?(假設 x、y 在迴圈內不會被更動)
  3. 對上方迴圈中的索引計算 i * 4 進行強度削減時,下列轉換何者正確?
  4. 上方迴圈難以使用SIMD指令向量化,其主要原因為何?
  5. 在上方函式中,編譯器無法直接進行把 *b 的讀取移到迴圈之外的最佳化,其原因為何?

這個領域的比較