平成28年度 春期 午前Ⅱ 問11
開発ツール
コンパイラに関する問題
コンパイラによる最適化において,オブジェクトコードの所要記憶容量が削減できるものはどれか。
- ア関数のインライン展開
- イ定数の畳込み
- ウループ内不変式の移動
- エループのアンローリング
答えと解説を見る
✓ これが正解イ定数の畳込み
解説
定数どうしの計算を前もって済ませる定数の畳込みはコードを小さくします。
定数の畳込みは、コンパイルの時点で値が決まる定数どうしの計算を、コンパイラが前もって行い、結果の値に置き換える最適化です。見分ける軸は、最適化によって命令が減るか増えるかです。例えば2×3のような式を、実行時に掛け算をする命令の代わりに6という値で済ませるので、計算の命令がなくなり、オブジェクトコードは小さくなります。実行速度も上がります。ほかの三つは主に速度を上げるための最適化で、命令を複製したり位置を移したりするため、記憶容量は減らないか、かえって増えます。計算を前倒しして消す最適化はコードも小さくする、と覚えると選べます。
ほかの選択肢はなぜ違うのか
- ア関数のインライン展開:関数のインライン展開は、関数を呼び出す箇所ごとに関数の本体を埋め込み、呼出しの手間を省く最適化です。呼び出す箇所が多いほど同じ処理の写しが増えるので、オブジェクトコードは大きくなりがちです。
- ウループ内不変式の移動:ループ内不変式の移動は、ループの中で毎回同じ結果になる計算をループの外へ出し、一度だけ計算するようにする最適化です。実行回数は減りますが、命令は移るだけなので、所要記憶容量はほとんど変わりません。
- エループのアンローリング:ループのアンローリングは、ループの本体を何回分か並べて書き、繰返しの判定や分岐の回数を減らす最適化です。本体を複製して並べるので、オブジェクトコードはかえって大きくなります。
出典:平成28年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問11
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)