コンパイラの最適化とは?こんぱいらのさいてきか
コンパイラの最適化とは、意味を変えないまま、生成コードを速くしたり小さくしたりするコンパイラの変換。組込みでは速度を狙う変換と容量を狙う変換が相反するため、どちらを優先するかがROM残量と実時間要件を見比べた設計判断になる。
最終更新:2026-10-06
この語が出る過去問を解く →背景
汎用機なら速い方を選べば済むが、ROMが数十キロバイトの機器では、速くする変換がそのまま容量超過を招く。インライン展開もループアンローリングも、呼出しや分岐の手間を省く代わりにコードを複製するからである。逆に定数の畳込みや共通部分式の除去は命令そのものを消すので、速度と容量の両方に効く。どの水準を掛けるかは、締切とROM残量の両方から決める。
具体例
for(i=0;i<100;i++) a[i]=60*60*24+b; では、60*60*24が定数畳込みで86400に置き換わって乗算命令が消え、ループ内で値の変わらない+bはループ外へ移される。一方この繰返しを4回分ずつ展開すると、分岐は4分の1になるが本体の命令列はおよそ4倍に膨らむ。
試験での引っ掛け
「最適化=小さくなる」と一括りにしない。容量が減るのは命令を消す種類だけで、インライン展開とアンローリングは増やす方向に働く。またレジスタや共有変数を指すポインタにvolatileを付け忘れると、必要なアクセスを消されて動かなくなる。
関連用語
出た過去問
出典:平成28年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問11(IPA)
コンパイラによる最適化において、オブジェクトコードの所要記憶容量が削減できるものはどれか。
正解:定数の畳込み
要点:定数畳込みは命令自体を消すのでコード量が減る
定数の畳込みは、コンパイル時に値が確定する演算をあらかじめ計算し、その結果の定数に置き換える最適化である。実行時の演算命令そのものが消えるので、生成されるコードの量が減り、実行速度も上がる。これに対し、インライン展開やループ展開は実行速度を狙って命令を複製するため、コード量は増える方向に働く。
出典:平成31年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問11(IPA)
コンパイラによる最適化において、オブジェクトコードの所要記憶容量が削減できるものはどれか。
正解:定数の畳み込み
要点:定数の畳み込みは事前計算で命令を減らし容量も削減する
定数の畳み込みは、コンパイル時に確定する定数式をあらかじめ計算して結果に置き換える最適化で、実行時の演算命令が消えるためコードサイズも実行時間も削減できる。これに対しインライン展開とループアンローリングは、呼出しや分岐を減らす代わりにコードを複製するのでオブジェクトコードは大きくなる。ループ内不変式の移動は実行回数を減らす最適化で、記憶容量の削減が主目的ではない。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。