コンパイラーは、コンパイラーが指示するユーザー関数のインライン展開をサポートするオプションに加えて、インライン関数展開の条件をより正確に指示できるオプションも提供します。
コンパイラーは、中間言語ユニットの絶対値でルーチンの相対的なサイズを測定します。この値は、生成される命令の数とほぼ等しくなります。コンパイラーは、中間言語ユニットの評価を使用して、ルーチンと関数を小さな関数、中くらいの関数、大きな関数に分類します。次に、コンパイラーは、この評価を使用して関数をいつインライン展開するか決定します。インライン展開の最低条件が満たされ、他がすべて等しい場合、コンパイラーは小さな関数をインライン展開し、大きな関数はインライン展開しません。
しかし、以下のデベロッパーが指示するインライン展開のオプションを使用することで、最適化機構が小さな関数と大きな関数を区別するために使用している境界を変更することができます。このオプションは、IA-32 アーキテクチャー、インテル® 64 アーキテクチャー、および IA-64 アーキテクチャーでサポートされます。
一般に、-inline-factor (Linux* および Mac OS* X) オプションと /Qinline-factor (Windows*) オプションは以下の個々のインライン化オプションを使用する前に使用します。このオプションは、その他のさまざまな上限オプションを制御します。
Linux および Mac OS X |
Windows |
効果 |
---|---|---|
inline-max-size、inline-max-total-size、inline-max-per-routine、inline-max-per-compile など上限を定義するすべてのインライン化オプションに適用される比率を制御します。上限オプションは個々に上限を指定できますが、この単一オプションを使用すると、1 コマンドですべての上限オプションを制御でき、効率的です。 デフォルトでは、このオプションは係数 1 に対応する 100 を比率に使用します。200 は、係数 2 を意味します。比率の設定には注意が必要です。上限を高く設定すると、インライン化を多く行うことが可能ですが、システムでメモリー不足を引き起こすことがあります。 詳細は、次のトピックを参照してください。
|
||
コンパイラーがインライン化を行えるところは、どこでも関数をインライン化します。通常、コンパイラーは、ソースコード中のキーワード (__forceinline など) に基づいて、インライン展開用にマークされている関数を判断します。しかし、ソースコード中のこれらの宣言子はすべて、インライン展開の推奨としてのみ解釈されます。このオプションは、インライン展開の推奨を命令として解釈し、インライン展開を安全に行うことができる場合、マークされている関数をインライン展開するようにコンパイラーに指示します。 詳細は、次のトピックを参照してください。
|
||
小さなルーチンの最大サイズを再定義します。指定された値以下のサイズのルーチンはインライン展開される可能性が多くなります。 詳細は、次のトピックを参照してください。
|
||
大きなルーチンの最小サイズを再定義します。指定された値以上のサイズのルーチンはインライン展開される可能性が少なくなります。 詳細は、次のトピックを参照してください。
|
||
インライン展開される関数の展開サイズを制限します。 詳細は、次のトピックを参照してください。
|
||
ルーチン内でインライン化を適用する回数を制限します。 詳細は、次のトピックを参照してください。
|
||
コンパイル単位でインライン化を適用する回数を制限します。 コンパイル単位の制限は、-ipo オプション (Linux および Mac OS X) または /Qipo オプション (Windows) を指定しているかどうかによって異なります。IPO を有効にしている場合、コンパイルの一部であるソースファイルはすべて 1 つのコンパイル単位であると考えられます。IPO が関与しないコンパイルの場合、各ソースファイルが別のコンパイル単位であると考えられます。 詳細は、次のトピックを参照してください。
|