インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

大規模プログラムの IPO

多くの場合、IPO ではリンク時のコンパイルで 1 つのオブジェクト・ファイルが生成されます。これは、プログラムが大規模だと効率が悪く、最悪の場合、アプリケーションで [Q]ipo コンパイラー・オプションを使用できないことがあります。

この問題を回避するには、次の 2 つの方法のいずれかを行います。1 つ目は、サイズベースのヒューリスティックです。このヒューリスティックでは、大規模なアプリケーションのリンク時のコンパイルにおいて複数のオブジェクト・ファイルを自動生成します。2 つ目の方法は、マルチオブジェクト IPO の処理をコンパイラーに手動で指示する方法です。

いずれの方法を用いるにしても、最初にコンパイラーのデフォルト設定を使用して、結果を検証すると良いでしょう。デフォルトで期待していた結果が得られない場合は、異なるオブジェクト・ファイル数を生成して検証します。

[Q]ipo-jobs コンパイラー・オプションを使用して、並列 IPO ビルド中に実行されるプロセスやジョブの数を制御します。

[Q]ipoN を使用した複数のオブジェクト・ファイルの作成

[Q]ipo0 を指定した場合 (値を何も指定しない場合と同じ)、コンパイラーはヒューリスティックを使用し、アプリケーション・サイズに応じて作成するオブジェクト・ファイルの数を判断します。小さなアプリケーションでは 1 つのオブジェクト・ファイルを、大きなアプリケーションでは 2 つ以上のオブジェクト・ファイルを生成します。0 よりも大きな値を指定すると、ソースファイルの数を超える値を渡さない限り、コンパイラーは指定した数のオブジェクト・ファイルを生成します。ソースファイルの数を超える値を指定した場合は、コンパイラーは各ソースファイルのオブジェクト・ファイルを作成した後にオブジェクト・ファイルの生成を停止します。

次のコマンド例は、[Q]ipo2 オプションを使用して大規模なプログラムをコンパイルする方法を示します。

オペレーティング・システム

コマンド例

Windows*

icl /Qipo2 /c a.cpp b.cpp

Linux*

icpc -ipo2 -c a.cpp b.cpp

macOS*

icpc -ipo2 -c a.cpp b.cpp

上記のコマンド例を実行すると、コンパイラーは OS 依存の命名規則を使用してオブジェクト・ファイルを生成します。Linux* および macOS* では、ipo_out.oipo_out1.o、および ipo_out2.o が上記のコマンド例により生成されます。Windows* では、ファイル名に同じ規則が適用されますが、ファイルの拡張子は .obj になります。

「IPO の使用」または「リンクツールとオプション」にあるように、生成されたオブジェクト・ファイルをリンクします。

最大オブジェクト・ファイル数

[Q]ipo-separate を使用すると、複数オブジェクトのコンパイルでコンパイラーがサポートする最大数のオブジェクト・ファイルを生成できます。オブジェクト・ファイルの最大数は、リンク行で渡された擬似オブジェクト・ファイルの数と同じです。

例えば、次のように指定します。

オペレーティング・システム

コマンド例

Windows*

Icl -Qipo-separate -Qipo-c a.obj b.obj c.obj

Linux*

icpc -ipo-separate -ipo-c a.o b.o c.o

macOS*

icpc -ipo-separate -ipo-c a.o b.o c.o

コンパイラーは、上記の命名規則を使用して複数のオブジェクト・ファイルを生成します。

「IPO の使用」または「リンクツールとオプション」にあるように、生成されたオブジェクト・ファイルをリンクします。

関連情報