編譯器
在上方迴圈中,哪個計算會成為迴圈不變運算式搬移(搬到迴圈外)的對象?(假設 x、y 在迴圈內不會被更動)
for (i = 0; i < n; i++)
a[i] = b[i] * (x * y);
- Ab[i] * (x * y) 整體
- Bx * y
- C對 a[i] 的指派
查看答案與解析
正確答案:B. x * y
迴圈不變運算式搬移是一種最佳化,會把每次重複都得到相同值的計算移到迴圈之前,只計算一次。x 與 y 在迴圈中不會改變,因此 x * y 在每次重複中都是相同的值,可以在迴圈前計算 t = x * y,再寫成 a[i] = b[i] * t。b[i] 隨 i 而有不同的值,所以 b[i] * (x * y) 整體無法搬移。對 a[i] 的指派每次重複都是寫入不同的元素,所以留在迴圈內。
- A. b[i] 每次重複都會改變,所以整體無法搬移。
- B. 正確。x * y 在每次重複中都是相同的值。
- C. 每個元素都需要指派,所以留在迴圈內。