エンベデッドシステムスペシャリスト 2014年 午前2 問10
問題文
コンパイラによる最適化において、オブジェクトコードの所要記憶容量が削減できるものはどれか。
選択肢
ア:関数のインライン展開
イ:定数の畳込み(正解)
ウ:ループ内不変式の移動
エ:ループのアンローリング
🔒 解説は解答すると表示されます
定数畳込み【午前2解説】
正解の理由
イの定数の畳込みは、コンパイル時に計算できる定数式をあらかじめ計算し、その結果に置き換える最適化です。
たとえば、実行時に計算する
3 + 4 を、コンパイル時に 7 として扱います。計算命令をオブジェクトコードに出力せずに済むため、オブジェクトコードの所要記憶容量を削減できる場合があります。解法ステップ
- 問われているのは、実行速度ではなくオブジェクトコードの記憶容量を削減する最適化だと確認します。
- 各選択肢が、一般にコード量を増やすか、実行時の計算を減らすかを考えます。
- 定数式をコンパイル時に計算し、実行時の命令を減らせる定数の畳込みを選びます。
選択肢別の誤答解説
-
ア:関数のインライン展開
関数呼出しを減らして実行速度を高める手法です。関数本体を呼出し箇所に展開するため、コード量が増え、オブジェクトコードの容量が大きくなることがあります。 -
イ:定数の畳込み
定数だけで構成される式をコンパイル時に計算し、実行時の計算命令を省けます。コード量の削減につながるため、正解です。 -
ウ:ループ内不変式の移動
ループの繰返し中に値が変わらない計算を、ループの外に移す手法です。実行時の計算回数を減らすのが主な目的であり、コード量の削減を直接狙うものではありません。 -
エ:ループのアンローリング
ループの繰返し処理を展開し、ループ制御の処理を減らす手法です。実行速度の向上が期待できますが、命令を展開するため、コード量は増える傾向があります。
よくある誤解
-
実行速度が向上する最適化なら、コード量も減る
とは限りません。インライン展開やループのアンローリングのように、速度向上と引換えにコード量が増える手法があります。 -
定数の畳込みは、定数をまとめて保存する最適化である
という誤解があります。定数式をコンパイル時に計算し、実行時の計算命令を減らす最適化です。 -
どのプログラムでも必ず容量が減る
とは限りません。実際の効果は、式や命令の形式、コンパイラの実装などによって異なります。
補足コラム
コンパイラの最適化には、実行時間を短くするもの、コード量を減らすもの、メモリ使用量を抑えるものなどがあります。問題で「何を改善する最適化か」を見極めることが、選択肢を絞るポイントです。
定数の畳込みのほか、同じ式を何度も計算しないようにする共通部分式の除去も、不要な命令を減らすことがあります。
FAQ
Q. 定数の畳込みでは、どのような式が対象になりますか?
A. コンパイル時点で値が確定している定数式です。たとえば、
A. コンパイル時点で値が確定している定数式です。たとえば、
3 + 4 のような式が該当します。Q. 関数のインライン展開は、なぜコード量が増えるのですか?
A. 関数呼出しを関数本体の命令列に置き換えるため、同じ関数を複数箇所から呼び出すと、その本体が複数箇所に展開されることがあるためです。
A. 関数呼出しを関数本体の命令列に置き換えるため、同じ関数を複数箇所から呼び出すと、その本体が複数箇所に展開されることがあるためです。
関連キーワード: 定数畳込み、コンパイラ最適化、インライン展開、ループ不変式移動、ループアンローリング

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

