インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド

関数のインライン展開

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

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

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

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

警告

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

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

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

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

IPO の PGO との併用 (Windows*)

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

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

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

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

デフォルトでは、標準ライブラリー関数と算術ライブラリー関数のいくつかは、関数の呼び出し時点で、コンパイラーによって自動的にインライン展開されます。通常、この処理によって計算速度が速くなります。

libirclibm、または svml ライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。

-fno-builtin (Linux* および OS X*) オプションまたは /Oi- (Windows*) オプションは、組込み関数のインライン展開および名前による認識サポートとその最適化を無効にします。これらのオプションは、標準ライブラリー・ルーチンを独自のバージョンで再定義し、そのルーチンのバージョンが標準ライブラリー・ルーチンと同じ名前の場合に使用します。

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

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


このヘルプトピックについてのフィードバックを送信