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