編譯器

對上方程式碼進行共同子運算式消除時,下列說明何者正確?

x = (a + b) * c;
y = (a + b) * d;
  1. A只計算一次 a + b 並存入暫存變數,在兩個運算式中重複使用
  2. Bx 與 y 是相似的運算式,所以刪除其中一個的計算
  3. C將乘法替換為加法,使計算變輕鬆
查看答案與解析

正確答案:A. 只計算一次 a + b 並存入暫存變數,在兩個運算式中重複使用

共同子運算式消除是一種最佳化:當重複計算會得到相同值的運算式時,只計算一次並重複利用其結果。在這個範例中,先算出 t = a + b,再令 x = t * c、y = t * d,加法就少了一次。不過必須確認兩個運算式之間 a 與 b 沒有被改寫。x 與 y 是不同的值,不能刪除其中任何一個。將乘法替換為較輕的運算,則是稱為強度削減的另一種最佳化。

  • A. 正確。只計算一次相同的運算式並重複使用。
  • B. x 與 y 的值不同,兩者都需要。
  • C. 將重運算變輕的是強度削減。
練習這個領域 前往領域頁面

編譯器的其他題目

  1. 在無用程式碼刪除(死碼消除)中被移除的對象,下列何者正確?
  2. 關於函式行內展開(inline expansion)的優點與缺點,下列組合何者正確?
  3. 關於迴圈展開(loop unrolling)的主要效果,下列何者正確?
  4. 在上方迴圈中,哪個計算會成為迴圈不變運算式搬移(搬到迴圈外)的對象?(假設 x、y 在迴圈內不會被更動)
  5. 對上方迴圈中的索引計算 i * 4 進行強度削減時,下列轉換何者正確?

這個領域的比較