インライン展開

インライン展開とは、ある特定の関数呼び出しをその関数の実際のコードで置き換えることであり、他のすべての最適化の前に実行されます。 インライン展開により、リンケージのオーバーヘッドが排除されるだけでなく、呼び出し先の関数全体が呼び出し側に公開されるため、コンパイラーはさらに効果的にコードを最適化できるようになります。
注: IPA でのインライン展開の相違については、IPA でのインライン展開を参照してください。
以下のタイプの呼び出しはインライン展開されません。
  • 呼び出しのパラメーター数が、関数定義のパラメーター数に一致しない呼び出し。 この例は、variable argument 関数呼び出しです。
  • 直接に再帰的な呼び出し。ルーチンがそれ自体を呼び出す場合。
  • K&R スタイルの var_arg 関数。

表 1 に示されている C の CCNGOP1 および CCNGOP2 を例として考えてみましょう。 CCNGOP1 は、which_group() 関数について #pragma inline ディレクティブを指定しています。 CCNGOP1 をコンパイルするときに OPTIMIZE オプションを指定すると、コンパイラーは CCNGOP1 が CCNGOP2 と同じであると判断します。

表 1. 最適化の例
サンプル・プログラム CCNGOP1 サンプル・プログラム CCNGOP2
/* 最適化を示す例 */

#include <stdio.h>
#pragma inline (which_group)
int which_group (int a) {
   if (a < 0) {
      printf("first group¥n");
      return(99);
   }
   else if (a == 0) {
      printf("second group¥n");
      return(88);
   }
   else {
      printf("third group¥n");
      return(77);
   }
}

int main (void) {
   int j;

   j = which_group (7);

   return(j);
}
/* これも最適化を示す例 */

#include <stdio.h>

int main(void) {

   printf("third group¥n");   /* a lot less code 
                                 generation */

   return(77);
}