コンパイラ
上のループで、ループ不変式の移動(ループの外への移動)の対象になる計算はどれか。(x、yはループ内で変更されないものとする)
for (i = 0; i < n; i++)
a[i] = b[i] * (x * y);
- Ab[i] * (x * y) 全体
- Bx * y
- Ca[i] への代入
答えと解説を見る
正解:B. x * y
ループ不変式の移動は、繰り返しのたびに同じ値になる計算をループの前に出して、1回だけ計算する最適化です。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. 代入は要素ごとに必要で、ループに残ります。