インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
コンパイラーは、コンパイラーが指示するユーザー関数のインライン展開をサポートするオプションに加えて、インライン関数展開の条件をより正確に指示できるオプションとプラグマを提供します。
コンパイラーは、中間言語ユニットの絶対値でルーチンの相対的なサイズを測定します。この値は、生成される命令の数とほぼ等しくなります。 コンパイラーは、中間言語ユニットの評価を使用して、ルーチンと関数を小さな関数、中くらいの関数、大きな関数に分類します。 次に、コンパイラーは、この評価を使用して関数をいつインライン展開するか決定します。インライン展開の最低条件が満たされ、他がすべて等しい場合、コンパイラーは小さな関数をインライン展開し、大きな関数はインライン展開しません。
通常、コンパイラーは、次の項目に基づいてインライン展開用の関数を判断します。
以下のデベロッパーが指示するインライン展開のオプションとプラグマを使用することで、インライン展開処理で小さな関数と大きな関数を区別するのに使用する境界を変更することができます。
一般に、[Q]inline-factor オプションは以下の個々のインライン展開オプションを使用する前に使用します。このオプションは、その他のさまざまな上限オプションを制御します。
インライン展開の上限に達すると、コンパイラーは最高レベルの警告を発行します。 警告では、達した上限、および完全なレポートを取得するためのオプションやプラグマが示されます。 例えば、次のようなメッセージが表示されます。
インライン展開が max-total-size の制限により禁止されています。詳細レポートを出力するには -qopt-report -qopt-report-phase=ipo を使用します。
レポートには、問題の解決に役立つコマンドライン・オプションやプラグマが記載されています。
次の表は、関数のインライン展開の微調整を行うオプションの一覧です。 オプションに関連するプラグマは、説明に記載されています。
オプション | 説明 |
---|---|
[Q]inline-factor |
inline-max-size、inline-max-total-size、inline-max-per-routine、inline-max-per-compile など上限を定義するすべてのインライン展開オプションに適用される比率を制御します。 上限オプションは個々に上限を指定できますが、この単一オプションを使用すると、1 コマンドですべての上限オプションを制御でき、効率的です。 デフォルトでは、このオプションは係数 1 に対応する 100 を比率に使用します。 200 は、係数 2 を意味します。 比率の設定には注意が必要です。上限を高く設定すると、インライン展開を多く行うことが可能ですが、システムでメモリー不足を引き起こすことがあります。 |
[Q]inline-forceinline |
コンパイラーがインライン展開を行えるところは、どこでも関数をインライン展開します。 このオプションを指定しないと、コンパイラーは、__inline キーワードが指定された関数を単にインライン展開が推奨される関数として扱います。 このオプションを指定すると、__forceinline キーワードが指定されているかのように扱います。 |
[Q]inline-min-size |
小さなルーチンの最大サイズを再定義します。指定された値以下のサイズのルーチンはインライン展開される可能性が多くなります。 |
[Q]inline-max-size |
大きなルーチンの最小サイズを再定義します。指定された値以上のサイズのルーチンはインライン展開される可能性が少なくなります。 |
[Q]inline-max-total-size |
インライン展開される関数の展開サイズを制限します。 #pragma optimization_parameter inline-max-total-size=N を使用して、個々のルーチンのインライン展開のサイズを制御することもできます。 |
[Q]inline-max-per-routine |
ルーチン内でインライン展開を適用する回数を制限します。 #pragma optimization_parameter inline-max-per-routine を使用して、ルーチンに適用されるインライン展開の回数を制御することもできます。 |
[Q]inline-max-per-compile |
コンパイル単位でインライン展開を適用する回数を制限します。 コンパイル単位の制限は、[Q]ipo コンパイラー・オプションを指定しているかどうかによって異なります。 IPO を有効にしている場合、コンパイルの一部であるソースファイルはすべて 1 つのコンパイル単位であると考えられます。 IPO が関与しないコンパイルの場合、各ソースファイルが別のコンパイル単位であると考えられます。 |