関数のインライン展開を行うと、関数呼び出しのランタイム・オーバーヘッドがなくなるため実行時間は短くなります。しかし、インライン展開を行うと、ほとんどの場合、コードのサイズが増加し、コードが複雑になり、コンパイル時間も長くなります。
インテル(R) コンパイラーでは、関数のインライン展開は、大きな関数よりも小さなユーザー関数で行われます。コンパイラーは、3 つのメイン・コンポーネントの条件が以下の条件と一致した場合にのみ関数をインライン展開することができます。
呼び出しサイト: 呼び出しサイトとは、インライン展開する関数を呼び出すサイトです。
各呼び出しサイトについて、次の条件が存在していなければなりません。
実引数の数が呼び出し先の仮引数の数と一致していること。
戻り値の数が呼び出し先の戻り値の数と一致していること。
実引数と仮引数のデータ型の間に互換性があること。
呼び出し元と呼び出し先は同じソース言語で記述されていること。多言語のインライン展開は実行できません。
呼び出し元: 呼び出し元は、呼び出しサイトを含む関数です。
呼び出し元は、次の条件と一致していなければなりません。
正しいサイズであること。呼び出し元にインライン展開するすべての呼び出しサイトから、呼び出し元にインライン展開される中間文は最大 2000 です。
スタティックであること。関数はスタティックとして宣言されている場合に呼び出されます。そうでない場合は削除されます。
呼び出し先: 呼び出し先は、呼び出されてインライン展開される関数です。
呼び出し先、またはターゲット関数は、次の条件と一致していなければなりません。
可変長引数リストを持っていないこと。
その他の理由で安全ではないと考えられないこと。
名前から実行頻度が低いと考えられないこと。例えば、名前に次の部分文字列を含むルーチンはインライン展開されません。abort、alloca、denied、err、exit、fail、fatal、fault、halt、init、interrupt、invalid、quit、rare、stop、timeout、trace、trap、および warn。
定義された最低条件が満たされると、コンパイラーはどのルーチンをインライン展開すればプログラムのパフォーマンスに最も寄与するかを調べて選び出します。これは、デフォルトのヒューリスティックを使用して行われます。プロファイルに基づく最適化 (PGO) (-prof-use (Linux*) または /Qprof-use (Windows*)) を使用するかどうかによって、コンパイラーが使用するインライン展開ヒューリスティックは異なります。
-ip または -ipo (Linux)、/Qip または /Qipo (Windows) で PGO を使用する場合、コンパイラーは次のヒューリスティックを使用します。
デフォルト・ヒューリスティックでは、プログラムに対して収集されたプロファイル情報を基に、最も頻繁に実行される呼び出しサイトに重点がおかれます。
デフォルトのインライン展開ヒューリスティックは、直接的な再帰呼び出しが検出されるとインライン展開を停止します。
デフォルト・ヒューリスティックを使用すると、インライン展開の最低条件を満たしている非常に小さな関数は必ずインライン展開されます。
デフォルトでは、コンパイラーは 230 以上の中間文では、関数のインライン展開は行いません。この値は次を指定して変更できます。
プラットフォーム |
コマンド |
---|---|
Linux |
-Qoption,c,-ip_ninl_max_stats=n |
Windows |
/Qoption,c,-ip_ninl_max_stats=n |
n は新しい値です。
inline または __inline のようにユーザーに宣言される関数には、より高い制限があります。
「Qoption 指定子の使用」および「プロファイルに基づく最適化の概要」を参照してください。
-ip または -ipo (Linux)、/Qip または /Qipo (Windows) で、PGO を使用しない場合、コンパイラーは、効果の低いインライン展開ヒューリスティック (インライン展開で最終のプログラムのサイズが増えない場合に関数をインライン展開する) を使用します。
コンパイラーは、Qoption 指定子を使用するいくつかの代案を提示します。詳細は、「デベロッパーが指示するユーザー関数のインライン展開」を参照してください。
-ip または -ipo でプロファイルに基づく最適化を使用しない場合、コンパイラーは次のヒューリスティックを使用します。
インライン展開が最終的なプログラムのサイズを増加しない場合、関数をインライン展開します。
関数が inline または __inline キーワード付きで宣言された場合、関数をインライン展開します。
コンパイラーは、ソースコードの特性を使用して、最も頻繁に実行される関数呼び出しを推定します。上記で述べたように、この推定は PGO ベースのヒューリスティックに適用されます。ソースの静的特性に基づいた、頻度の推定は、必ずしも正確であるとは限りません。従って、PGO なしで、/Qip および /Qipo を使用すると、コンパイル時間はより長くなり、アプリケーションの実行速度は遅くなることがあります。