編譯器
對上方程式碼進行共同子運算式消除時,下列說明何者正確?
x = (a + b) * c;
y = (a + b) * d;
- A只計算一次 a + b 並存入暫存變數,在兩個運算式中重複使用
- Bx 與 y 是相似的運算式,所以刪除其中一個的計算
- C將乘法替換為加法,使計算變輕鬆
查看答案與解析
正確答案:A. 只計算一次 a + b 並存入暫存變數,在兩個運算式中重複使用
共同子運算式消除是一種最佳化:當重複計算會得到相同值的運算式時,只計算一次並重複利用其結果。在這個範例中,先算出 t = a + b,再令 x = t * c、y = t * d,加法就少了一次。不過必須確認兩個運算式之間 a 與 b 沒有被改寫。x 與 y 是不同的值,不能刪除其中任何一個。將乘法替換為較輕的運算,則是稱為強度削減的另一種最佳化。
- A. 正確。只計算一次相同的運算式並重複使用。
- B. x 與 y 的值不同,兩者都需要。
- C. 將重運算變輕的是強度削減。