-ip と -ipo を使用してプロシージャ間の最適化 (IPO) を有効にすれば、コンパイラにコードを分析させて、次の表に示す最適化をすればどの部分に効果が出るかを調べられます。
最適化項目 | 影響を受ける部分 |
---|---|
関数のインライン展開 | 呼び出し、ジャンプ、分岐、ループ |
プロシージャ間での定数伝播 | 引数、グローバル変数、戻り値 |
モジュール・レベルでの静的変数の監視 | 現状以上の最適化、ループ不変コード |
不要コードの排除 | コードのサイズ |
関数特性の伝播 | 呼び出し命令の削除と呼び出し命令の移動。さらに、例外が発生してもリターンされない関数、アライメントが必要なスタック、引数のアライメントに関する部分も影響を受けます。 |
マルチファイルの最適化 | -ip と同じ部分に影響を与えますが、複数のファイル全体にわたって最適化を行います。 |
最適化項目 | 影響を受ける部分 |
---|---|
レジスタ内での引数の受け渡し | 呼び出し、レジスタの使用 |
関数のインライン展開は、プロシージャ間の最適化機構によって実行する主な最適化機能のうちの 1 つです。コンパイラは、頻繁に実行する関数呼び出しが存在していると判断した場合、その呼び出し命令を、当該関数自体のコードに置き換えることがあります (呼び出しのインライン展開)。
-ip オプションを指定すると、現在のソースファイル内で定義している関数内での呼び出し命令について関数のインライン展開を実行します。ただし、-ipo オプションを使用してマルチファイル IPO を指定すると、別々のファイル内で定義している関数内での呼び出し命令について関数のインライン展開が実行されます。このため、-ipo を指定する場合、アプリケーション全体または複数の関連するソースファイルを一緒にコンパイルすることは重要です。
IPO による最適化は、デフォルトでは実行されません。