エンベデッドシステムスペシャリスト 2019年 午前2 問11
問題文
コンパイラによる最適化において、オブジェクトコードの所要記憶容量が削減できるものはどれか。
選択肢
ア:関数のインライン展開
イ:定数の畳み込み(正解)
ウ:ループ内不変式の移動
エ:ループのアンローリング
🔒 解説は解答すると表示されます
定数の畳み込み【午前2解説】
正解の理由
定数の畳み込みとは、コンパイル時に値が確定している定数式を計算し、その計算結果で置き換える最適化です。
例えば、
3 * 4を実行時に計算する代わりに、コンパイル時に計算して12に置き換えます。これにより、オブジェクトコード中の演算命令を減らせる場合があります。そのため、所要記憶容量を削減できるものはイです。解法ステップ
- 問題が尋ねているのは、実行時間ではなく、オブジェクトコードの記憶容量を削減する最適化です。
- 各選択肢について、コードを短くするか、逆に増やす可能性があるかを確認します。
- 定数式を計算結果に置き換えて命令を減らせる「定数の畳み込み」を選びます。
選択肢別の誤答解説
-
ア:関数のインライン展開
関数呼出しをなくすために、関数本体を呼出し箇所へ展開する手法です。呼出しの実行時間を減らせることがありますが、関数本体が複数箇所にコピーされるため、オブジェクトコードの容量は増えやすくなります。 -
イ:定数の畳み込み
コンパイル時に計算できる定数式を計算結果に置き換え、不要な演算命令を減らせます。オブジェクトコードの容量を削減できる可能性があります。 -
ウ:ループ内不変式の移動
ループを繰り返しても値が変わらない計算を、ループの外へ移動する手法です。実行時の計算回数を減らせますが、主な目的は実行効率の向上であり、コード容量の削減とは限りません。 -
エ:ループのアンローリング
ループの繰返し処理を展開し、ループ制御の処理を減らす手法です。ループ本体のコードを複製するため、オブジェクトコードの容量は増えやすくなります。
よくある誤解
-
実行時間が短くなる最適化は、コード容量も小さくなる
そうとは限りません。インライン展開やループのアンローリングは実行効率を高める一方で、コードを複製して容量を増やすことがあります。 -
ループ内不変式の移動は、処理を減らすのでコードも小さくなる
減らすのは主にループ内での計算回数です。コード容量が必ず減るわけではありません。 -
定数の畳み込みは、実行時の計算を速くするだけである
実行時の計算を省けるだけでなく、演算命令を定数値に置き換えることで、コード容量も削減できる場合があります。
補足コラム
最適化の効果を考えるときは、「何を改善する手法か」を区別すると整理しやすくなります。定数の畳み込みは不要な演算をなくす最適化、ループ内不変式の移動は繰返し計算を減らす最適化、インライン展開やループのアンローリングは処理の実行効率を高める代わりにコード量を増やすことがある最適化です。
FAQ
定数の畳み込みでは、必ずオブジェクトコードが小さくなりますか?
必ずではありません。置換によって演算命令などを減らせる場合に、コード容量の削減につながります。
必ずではありません。置換によって演算命令などを減らせる場合に、コード容量の削減につながります。
定数の畳み込みと定数伝播は同じですか?
異なる最適化です。定数の畳み込みは定数式を計算する手法で、定数伝播は変数に代入された定数を、その後の処理へ反映する手法です。両者は組み合わせて使われることがあります。
異なる最適化です。定数の畳み込みは定数式を計算する手法で、定数伝播は変数に代入された定数を、その後の処理へ反映する手法です。両者は組み合わせて使われることがあります。
関連キーワード: 定数の畳み込み、コンパイラ最適化、インライン展開、ループ不変式移動、ループのアンローリング

\ せっかくなら /
エンベデッドシステムスペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

