平成31年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問11
テクノロジ/ソフトウェアコンパイラによる最適化において,オブジェクトコードの所要記憶容量が削減できるものはどれか。
出典:平成31年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問11
- ア関数のインライン展開
- イ定数の畳み込み
- ウループ内不変式の移動
- エループのアンローリング
正解:イ
解説
定数の畳み込み(コンスタントフォールディング)は,コンパイル時に計算結果が定まる定数式(例えば 2+3 など)をあらかじめ計算しておき,実行時の計算命令そのものをオブジェクトコードから取り除く最適化です。命令自体が削減されるため,オブジェクトコードの所要記憶容量を削減する効果があります。これに対し,関数のインライン展開やループのアンローリングは,呼出し処理やループ制御のオーバヘッドを減らして実行速度を高速化する代わりに,コードが展開されて重複するためオブジェクトコードのサイズはむしろ増加します。
選択肢ごとの解説
- ア誤り。関数のインライン展開は,関数呼出し先のコードを呼出し元に展開して埋め込む最適化であり,呼出しのオーバヘッドを削減して高速化する一方,コードが重複するためオブジェクトコードのサイズは増加します。
- イ正しい。定数の畳み込みは,コンパイル時に計算可能な定数式をあらかじめ計算しておくことによって実行時の計算命令を削除するため,オブジェクトコードの所要記憶容量を削減できます。
- ウ誤り。ループ内不変式の移動は,ループ内で値が変化しない計算をループの外に移動する最適化であり,主に実行時間の短縮を目的とするもので,オブジェクトコードのサイズ削減を主目的とするものではありません。
- エ誤り。ループのアンローリングは,ループの繰返し制御にかかるオーバヘッドを減らすために,ループ本体を複数回分展開して並べる最適化であり,コードが重複するためオブジェクトコードのサイズは増加します。