このセクションでは、インテル® コンパイラーの最適化機能を利用してオブジェクトと実行ファイルのサイズを小さくする方法に関するガイダンスを提供します。
最初に、パフォーマンスよりもコードサイズを優先するコンパイラー・オプションは 2 つあります。
速度よりもサイズを優先 |
Linux* および macOS*: -Os Windows*: /Os |
このオプションは、コードサイズが増えない最適化を有効にし、O2 より小さいサイズのコードを生成します。 Os オプションはコードサイズを大きくするだけでさほどの高速化にはつながらない最適化を無効にします。 |
コードサイズを最小化 |
Linux* および macOS*: -O1 Windows*: /O1 |
Os と比較して、O1 は一般にコードサイズを大きくするさらに多くの最適化を無効にします。O1 を指定すると、Os オプションがオンになります。 コードサイズを軽減する中間ステップとして、O1 を指定する前に、O3 を O2 に置換することができます。 O1 オプションは、分岐が多く、実行時間がループ内のコードに支配されない、非常に大きなコードサイズのアプリケーションでパフォーマンスを向上させます。 |
上記のオプションの詳細は、「コンパイラー・リファレンス」にある各オプションの説明を参照してください。
以降では、Os および O1 のデフォルトの動作と比較しても、コードサイズを向上する可能性がある手法について簡単に説明します。
次の表は、このセクションで説明しているコードサイズの最適化方法の一覧です。
インライン展開の無効化または軽減 |
バイナリーからのシンボルの削除 |
インテルが提供するライブラリーの動的リンク |
標準ライブラリーまたは組込み関数のインライン展開の無効化 |
スタックではなくレジスターで引数を渡すことの無効化 |
ループアンロールの無効化 |
自動ベクトル化の無効化 |
不要な 16 バイト・アライメントの回避 |
プロシージャー間の最適化 (IPO) の使用 |
上記のトピックで説明しているコンパイラー・オプションの詳細は、「コンパイラー・リファレンス」にある各オプションの説明を参照してください。
覚えておくべきこと:
Os および O1 を指定すると、いくつかの手法はデフォルトで適用されます。後続のトピックで説明するすべての手法は、より高い最適化レベルでも適用できます。
これらのトピックで参照されるいくつかのオプションは、必ずしもコードサイズを軽減するとは限りません。ターゲットコードの特性に応じて結果は異なります (良、中、不良)。許容可能なパフォーマンスを維持しつつ、バイナリーを小さくできるかどうか確認するため、これらの手法を試すことを推奨します。