平成28年 春期 エンベデッドシステムスペシャリスト 午前II 問11

コンパイラによる最適化において、オブジェクトコードの所要記憶領域が削減できるものはどれか。

 ア  関数のインライン展開  イ  定数の畳込み
 ウ  ループ内不変式の移動  エ  ループのアンローリング


答え イ


解説

 ア  関数のインライン展開は、プログラムの関数を呼び出したところに、関数内の処理を入れて動作としては関数へのジャンプをなくします。これにより関数ジャンプ時のレジスタ対比時間などが短縮でき処理速度は上がりますが、オブジェクトのサイズは増えます。
 イ  定数の畳込みは、プログラム中の定数(デファインで定義されたものを含む)同士の計算式を、コンパイル時に計算してしまうことです。
これにより、処理速度の向上と、オブジェクトサイズの削減ができます。
 ウ  ループ内不変式の移動、ループ処理の中でループ内からループの外に出しても処理内容が変わらないものを、ループ内に出すことです。これにより処理速度は向上します。
オブジェクトのサイズに影響はありません。
 エ  ループのアンローリングはループ処理をループしないベタな処理にすることです。
ループのジャンプ処理がなくなるだけ処理速度は向上しますが、オブジェクトのサイズは増えます。

※昔のコンパイラの最適化はあまりかしこくなかったのですが、最近の最適化は非常にかしこいです。
小賢しいアルゴリズム変更(やアセンブラ化)による処理時間短縮をするくらいなら、最適化オプションを“速度重視”にするほうが手っ取り早く、効果があります。


キーワード
・コンパイラの最適化

キーワードの解説
  • コンパイラの最適化(Optimize)
    CやC++などの高級言語をコンパイラでオブジェクトコードに変換するときに、コンパイラが処理速度やオブジェクトコードの容量の面から、最適な方法にすることです。
    コンパイラの最適化には、処理速度を重点的に最適化するもの、オブジェクトのサイズを重点的に最適化するものなどのオプションがあるのが普通で、オプションによって、プログラムの振る舞いに差が出ます。
    そのため、ソフトウェアの設計段階で最適化オプションについては決めて、後で変更しないようにすることが大事です。

もっと、「コンパイラの最適化」について調べてみよう。

戻る 一覧へ 次へ