エンベデッドシステムスペシャリスト 2016年 午前2 問11
問題文
コンパイラによる最適化において、オブジェクトコードの所要記憶容量が削減できるものはどれか。
選択肢
ア:関数のインライン展開
イ:定数の畳込み(正解)
ウ:ループ内不変式の移動
エ:ループのアンローリング
🔒 解説は解答すると表示されます
定数畳込みとコード容量【午前2解説】
正解の理由
イの定数の畳込みは、コンパイル時に計算できる定数式をあらかじめ計算し、その結果に置き換える最適化です。
例えば、プログラム中の「3×4」を実行時に計算する代わりに、コンパイル時に「12」に置き換えます。実行時に必要な命令が減るため、オブジェクトコードの所要記憶容量を削減できる可能性があります。
解法ステップ
- 問われているのは、実行速度ではなくオブジェクトコードの容量を削減する最適化だと確認します。
- 各選択肢が、命令を減らすのか、増やすのか、配置を変えるのかを考えます。
- 定数式を計算結果に置き換えて命令を減らせる、イを選びます。
選択肢別の誤答解説
-
ア:関数のインライン展開
関数呼出しをなくし、関数本体の処理を呼出し元に埋め込む最適化です。呼出しの処理を省ける一方で、関数本体が複数箇所に展開されると、コード容量は増えやすくなります。 -
イ:定数の畳込み
定数式をコンパイル時に計算し、計算結果に置き換えます。実行時に必要な計算命令を減らせるため、コード容量の削減につながります。 -
ウ:ループ内不変式の移動
ループの繰返し中に値が変化しない式を、ループの外へ移動する最適化です。主な目的は、同じ計算を繰り返す回数を減らして実行速度を向上させることです。コード容量が必ず減るとは限りません。 -
エ:ループのアンローリング
ループの繰返し処理を複数回分まとめて展開し、ループ制御にかかる処理を減らす最適化です。ループ処理の命令が複製されるため、コード容量は増えやすくなります。
よくある誤解
-
実行速度が向上する最適化なら、コード容量も必ず減る
最適化の目的はさまざまです。速度を優先する最適化では、命令を増やしてコード容量が大きくなることもあります。 -
ループ内不変式の移動は、ループ外に処理を出すから必ずコードが短くなる
繰返し実行される回数は減りますが、コード容量の削減を目的とする最適化とは限りません。 -
定数の畳込みと定数伝播は同じ処理である
定数畳込みは定数式を計算する処理です。定数伝播は、変数に代入された定数を、その後の式や処理に反映させる処理です。
補足コラム
定数畳込みは、プログラムを実行する前に計算できる処理を済ませる最適化です。定数式が多いほど命令を削減しやすい一方、効果はプログラムの内容やコンパイラの実装によって異なります。試験では、各最適化の典型的な目的と、コード容量が増減しやすい傾向を押さえましょう。
FAQ
Q. 定数畳込みは、実行速度の向上にも役立ちますか?
A. 役立つことがあります。実行時の計算命令を省けるため、処理時間の短縮にもつながります。
A. 役立つことがあります。実行時の計算命令を省けるため、処理時間の短縮にもつながります。
Q. ループのアンローリングは、なぜコード容量が増えやすいのですか?
A. ループの中身を複数回分展開するため、同じ処理の命令がコード中に重複して記述されるからです。
A. ループの中身を複数回分展開するため、同じ処理の命令がコード中に重複して記述されるからです。
関連キーワード: 定数畳込み、定数伝播、インライン展開、ループ内不変式の移動、ループのアンローリング、コンパイラ最適化

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

