Share via


インライン、 __inline、 __forceinline

inline と __inline 指定子はコンパイラが関数を呼び出す場所に各関数本体のコピーを挿入します。

inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific

解説

挿入 (インライン展開またはインライン展開) 有用である場合にのみコンパイラのコストと利点は解析が実行されます。インライン展開は大規模なコード サイズの潜在的な負荷が関数呼び出しのオーバーヘッドが軽減されます。

キーワードは __forceinline のコストと利点解析をオーバーライドしプログラマによる判定に依存します。__forceinline を使用する場合の作業の考慮事項。__forceinline では差別の使用は限らないな最小限のパフォーマンスを向上させるだけでなく場合によってはパフォーマンスの低下に大きいできます (コードでは実行可能ファイルの拡張によってページングたとえば)。

インライン関数を使用して関数呼び出しに関連するオーバーヘッドを回避するためプログラムを高速化できます。関数によって配置されるインライン関数にはコードの最適化に使用できない可能性があります。

インライン展開に関するオプションとキーワードは、インライン展開の対象となる候補をコンパイラに示すだけです。関数がインライン展開という保証はありません。インライン展開 __forceinline キーワードの特定の関数コンパイラを実行できません。/clr してコンパイルする場合コンパイラは関数に適用されるセキュリティ属性がの場合インライン関数。

インライン のキーワードは C++ でだけ使用できます。__inline と __forceinline のキーワードは C と C++ の両方で使用できます。以前のバージョンとの互換性のために**_inline** は __inline のシノニムです。

インライン のキーワードがインライン展開がどのようにコンパイラに指示します。ただしインライン コードを挿入せずにリンケージを呼び出しているコンパイラが関数の別のインスタンスをインスタンス化 () を作成し標準を作成できます。これが発生する 2 種類の事例を次に示します。:

  • 再帰関数。

  • 翻訳単位でポインターを通じて他の場所で参照される関数。

これらの原因はインライン展開はコンパイラの裁量で 他にあるテーブルに 干渉する可能性があります。; インライン の指定子で関数をインライン展開する必要はありません。

正規関数と同様に引数の評価で定義されている順序はインライン関数はありません。実際引数が通常の関数呼び出しのプロトコルを使用して渡されたときに評価される順序と異なる場合があります。

/Ob コンパイラの最適化オプションは関数のインライン展開が実際に発生するかどうかを確認できます。

/LTCGソース・コードの要求したかどうかに関係なくモジュール間のインライン展開を実行します。

例 1

// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
   if( a > b ) 
      return a;
   return b;
}

クラスのメンバー関数は インライン のキーワードを使用するかクラス定義内の関数を定義することでインラインで宣言できます。

例 2

// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;

class MyClass {
public:
   void print() { cout << i << ' '; }   // Implicitly inline
private:
   int i;
};

Microsoft 固有の仕様 →

__inline のキーワードは インライン と同じです。

__forceinline とコンパイラはすべての状況でインラインでないコードはできません。コンパイラはインライン関数できません :

  • 関数または呼び出し元が /Ob0 (デバッグ ビルドの既定) にコンパイルされます。

  • 関数および呼び出し元は例外処理 (C++ 例外処理そのほかの 1 の構造化例外処理) の異なる型を使用します。

  • 関数に可変個引数リストがあります。

  • 関数は /Og/Ox/O1または /O2 を指定してコンパイルしたインライン アセンブリを使用しません。

  • 関数は #pragma inline_recursion () とともに再帰的伴われなくいません。プラグマで再帰関数は 16 回の呼び出しの既定の深さにインライン。インライン深さを減らしてするにはinline_depth のプラグマを使用します。

  • 関数は仮想で実質的に呼び出されます。仮想関数への直接呼び出しをインライン展開できます。

  • プログラムが関数のアドレスを受け取り呼び出しは関数へのポインターによって行われます。受け取るアドレスを持つ関数の直接呼び出しをインライン展開できます。

  • 関数は生の __declspec の修飾子でマークされます。

コンパイラがインライン __forceinline で宣言された関数はレベル 1 の警告が生成されます。

再帰関数は最大 16 までの呼び出し inline_depth のプラグマで指定されている深さに代わるなインラインです。その深さ再帰関数の呼び出しは関数のインスタンスの呼び出しとして扱われます。は再帰関数がインラインでチェックするヒューリスティック深さ 16 を超えることはできません。inline_recursion のプラグマは配置によって関数のインライン展開を制御します。現在関連情報については 関数のインライン展開 (/Ob) コンパイラ オプションを参照してください。

終了 Microsoft 固有の仕様→

インライン の指定子の使用の詳細については" " を参照してください :

参照

関連項目

C++ のキーワード

noinline

auto_inline