インライン関数の展開

インライン関数の展開は、IPO で通常必要とされるプログラム全体の解析の基準を満たす必要がないため、この最適化はプロシージャー間の最適化 (IPO) で主に使用されるものの 1 つです。コンパイラーは、頻繁に実行する関数呼び出しが存在していると判断した場合、その呼び出し命令を、当該関数自体のコードに置き換えます。

インライン関数の展開は、比較的大きな関数よりも小さなユーザー関数で有利です。この最適化は、次の操作を行ってアプリケーションのパフォーマンスを向上します。

関数のインライン展開を行うと、関数呼び出しのランタイム・オーバーヘッドがなくなるため実行時間は短くなります。しかし、インライン展開を行うと、コードサイズやコードの複雑性が増し、コンパイル時間も長くなります。一般に、コンパイラーに関数のインライン展開を指示すると、より広いコンテキストでソースファイルが検証され、より多くの最適化の機会を見つけることができます。

-ip (Linux* および Mac OS* X) または /Qip (Windows*) を指定 (単一ファイル IP) すると、現在のソースファイル内で定義されているプロシージャーへの呼び出しに対してインライン関数の展開を行います。一方、-ipo (Linux および Mac OS X) または /Qipo (Windows) を指定 (マルチファイル IPO) するとその他のファイルで定義されたプロシージャーへの呼び出しに対して関数のインライン展開を行います。

警告

-ip および -ipo (Linux および Mac OS X) または /Qip および /Qipo (Windows) のどちらのオプションを指定した場合も、条件によってはコンパイル時間とコードサイズが著しく増える場合があります。

インライン展開のルーチンの選択

ンパイラーはどのルーチンをインライン展開すればプログラムのパフォーマンスに最も寄与するかを調べて選び出しますこの選択は、デフォルトのヒューリスティックを使用して行われます。プロファイルに基づく最適化 (PGO) (-prof-use (Linux および Mac OS X) または /Qprof-use (Windows)) を使用するかどうかによって、コンパイラーが使用するインライン展開ヒューリスティックは異なります。

-ip または -ipo (Linux および Mac OS X)、/Qip または /Qipo (Windows) で PGO を使用する場合、コンパイラーは次のガイドラインに沿ってヒューリスティックを適用します。

PGO (Windows)

IPO と PGO を組み合わせると、IPO を単独で行うよりも良い結果を得られます。PGO は、IPO で用いられる静的プロファイル情報よりも良質な最適化の機会を提供する動的プロファイル情報を生成します。

コンパイラーは、ソースコードの特性を使用して、最も頻繁に実行される関数呼び出しを推定します。この推定は上記の PGO ベースのガイドラインに適用されます。ソースの静的特性に基づいた、頻度の推定は、必ずしも正確であるとは限りません。

PGO と IPO を組み合わせて行う場合は静的プロファイル情報の使用は避けてください。静的プロファイル情報を使用すると、コンパイラーは使用されるソースファイルのアプリケーション・パフォーマンスしか評価できません。動的に生成されたプロファイル情報を使用することにより、コンパイラーはアプリケーションの実際のパフォーマンス特性を見極めることができます。

ライブラリー関数のインライン展開

ユーザー関数がコンパイラーが提供したインライン・ライブラリー関数の名前と同じ場合、その関数はインライン・アセンブリー・コードに置き換えられてしまうことがあります。コンパイラーにより提供されるインライン関数の名前と同じ関数の呼び出しがある場合は、ユーザー定義の関数を呼び出す代わりに、コンパイラーはその関数を既知の関数呼び出しとみなし、関数呼び出しをアセンブリー・コードに置換します。

-fno-builtin (Linux および Mac OS X) オプションまたは /Oi- (Windows) オプションを使用して、ユーザー関数の使用を保証します。これらのオプションは、すべての組み込み関数のインライン化を無効にします。

インライン展開と関数のプリエンプション (Linux)

関数のプリエンプションを使用するには、-fpic または -fPIC を指定しなければなりません。デフォルトでは、コンパイラーはプリエンプションに必要な位置に依存しないコードの生成を行いません。