編譯器

對上方程式碼反覆進行常數傳播與常數摺疊,最終會變成什麼樣的程式碼?

int n = 8;
int m = n * 2;
return m + 1;
  1. Areturn n * 2 + 1;
  2. Breturn 8 * 2 + m;
  3. Creturn 17;
查看答案與解析

正確答案:C. return 17;

在常數傳播中,n被指派8之後不會再被更動,因此把使用n的地方替換為8,變成 m = 8 * 2。經常數摺疊將 8 * 2 計算為16後,m = 16,再經傳播與摺疊,m + 1 成為 16 + 1 = 17。n與m的指派不再被使用,會被當作無用程式碼刪除,只剩下 return 17;。中途停下的形式,或替換錯誤的形式,都不是最終結果。

  • A. n仍然殘留,傳播尚未完成。
  • B. 替換有誤,計算也尚未完成。
  • C. 正確。計算依 8 → 16 → 17 推進,只剩下常數。
練習這個領域 前往領域頁面

編譯器的其他題目

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

這個領域的比較