5.21 関数のインライン展開に関するコンパイラによる決定

関数のインライン展開が有効になっている場合、コンパイラは複雑なデシジョンツリーを使用して、関数をインライン展開するかどうかを決定します。

以下の簡略化されたアルゴリズムが使用されます。
  1. 関数が __forceinline で修飾されている場合は、関数をインライン展開することが可能な場合に、関数がインライン展開されます。
  2. 関数が __inline で修飾され、オプション --forceinline が選択されている場合は、関数をインライン展開することが可能な場合に、関数がインライン展開されます。
    関数が __inline で修飾され、オプション --forceinline が選択されていない場合は、関数をインライン展開することが実際的な場合に、関数がインライン展開されます。
  3. 最適化レベルが -O2 以上であるか、 --autoinline が指定されている場合は、ユーザから関数のインライン展開が明示的に指定されなかった場合でも、関数をインライン展開することが実際的な場合に、関数が自動的にインライン展開されます。
関数をインライン展開することが実際的であるかどうかをコンパイラが判断する際は、以下に示す他の基準も考慮に入れられます。
  • 関数のサイズと呼び出し回数。
  • 現在の最適化レベル。
  • 処理速度(-Otime)とサイズ(-Ospace)のどちらが最適化されているか。
  • 外部リンケージと静的リンケージのどちらが関数に含まれているか。
  • 関数にいくつのパラメータが含まれているか。
  • 関数の戻り値が使用されるかどうか。
コンパイラは、関数が __forceinline によって修飾されている場合でも、その関数をインライン展開しないように決定することがあります。以下の一般規則が適用されます。
  • 規模の小さい関数ほどインライン展開される可能性が高くなります。
  • -Otime を使用してコンパイルすると、関数がインライン展開される可能性が高くなります。
  • 大きな関数は、コード密度とパフォーマンスに悪影響を及ぼす可能性があるので、一般的にインライン展開されません。
__forceinline が使用されている場合でも、再帰関数はインライン展開できません。
関連する概念
5.20 インライン関数
5.22 関数の自動インライン展開とスタティック関数
5.23 インライン関数と、リンク時における未使用のアウトオブライン関数の削除
5.24 関数の自動インライン展開とマルチファイルのコンパイル
5.26 コンパイラモードとインライン関数
5.27 C++ および C90 モードでのインライン関数
5.28 C99 モードでのインライン関数
5.29 インライン関数とデバッグ
関連する参考文書
5.25 関数のインライン展開に関するコンパイラの決定をオーバーライドすることの制限
8.15 --autoinline、--no_autoinline
8.84 --forceinline
10.6 __forceinline
10.8 __inline
8.107 --inline、--no_inline
8.139 -Onum
8.143 -Ospace
8.144 -Otime
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.