C++inlineの詳細

2737 ワード

1、inlineの作用
C++では,頻繁に呼び出されるいくつかの小さな関数がスタックメモリを大量に消費する問題を解決するために,インライン修飾子が特に導入され,インライン関数として表される.
スタックスペースとは、プログラムのローカルデータを防止するメモリスペースです.システムではスタックスペースは限られており,頻繁に大量に使用するとスタックスペース不足によるプログラムエラーの問題を引き起こす.
プログラムコンパイル時に、コンパイラは、マクロ展開と同様に、プログラムに現れるインライン関数呼び出し式をインライン関数の関数体に置き換えます.次のようになります.
int min ( int v1, int v2)
{
	return (v1< v2 ? v1: v2);
}

//     ,            
int minval2 = min(i,j);

//      ,            
int minval2 = i < j ? v1: v2;

2、インライン関数のメリット
最大の利点はもちろん関数の実行効率を高めることであり、インライン関数は実際に空間を使用して時間を交換する方法であり、コードコピーを代価として、関数呼び出しのオーバーヘッドを省き、実行効率を向上させる.その他のメリットをまとめます.
  • コードがmin()の呼び出しを含む場合、このようなコードを読み、条件オペレータのインスタンスを読むよりも意味が強いことを説明する.
  • は、アプリケーションの300個の出現を変更するよりも、局所化された実装を変更することが容易である.
  • の意味は統一されており、各テストは同じ実装方式を保証することができる.
  • 関数は、他のアプリケーションのためにコードを書き換える必要がなく、再利用することができる.

  • 3、inlineの使用
    inlineには大きなメリットがありますが、使用には相応のルールがあります.
  • inlineは、関数内のコードの簡単な関数にのみ適用され、while、switchなどの複雑な構造制御文を含むことができず、インライン関数自体は再帰関数
  • ではない.
  • inline関数はコンパイラに対する提案にすぎず、最後に本当にインラインできるかどうかは、コンパイラに決定されます.
  • inlineキーワードは、関数をインラインにするには、関数定義体と一緒に配置する必要があります.関数宣言の前にinlineを置くだけで、何の役にも立たない.
  • 推奨:前の理由で、インライン関数の定義をヘッダファイルに置くことが望ましい.

  • 4、クラスとinline関数
    クラスに定義されたメンバー関数のデフォルトはインラインです.クラスにメンバー関数の定義が与えられず、その関数をインラインする場合は、クラスにinlineを追加する必要があります.次のようになります.
    class myclass
    {
    public:
    	int Add(int x, int y ){ return x+y; }; 	//        
    }
    

    メンバー関数の定義をクラス宣言に配置します.書くのは便利ですが、良いプログラミングスタイルではありません.
    class myclass
    {
    public:
    	int Add(int x, int y);
    };
    
    //    
    inline int A::Foo(int x, int y ){ return x+y; };
    

    理論はそうですが、VSでこのようなクラスメンバー関数を使用すると、リンクがエラーを報告します.だから、頭のファイルに書いたほうがいいです.
    virtual関数はinlineではなく、virtualは実行期間を知ってからどの関数を呼び出すかを決定することを意味し、inlineは実行前に呼び出し動作を呼び出された関数の本体に置き換えることを意味する.
    5、inlineとマクロの違い
    前の紹介では、inlineとマクロが似ていることにも気づいたかもしれませんが、彼らには何か違いがありますか?実はinlineはマクロ定義を置き換えるために使われています.次は両者を整理します.同じ点です.
  • 置換または展開により、関数呼び出しに関する動作がなくなり、効率が向上する
  • .
    相違点:
  • マクロ定義は二意形を生成しやすく、inline関数は
  • ではありません.
  • マクロ定義は前処理段階で行う置換であり、inline関数はコンパイル段階で置換
  • である.
  • マクロ定義は単純な置換にすぎませんが、inlineは関数であり、コンパイラは厳格なタイプと役割ドメインチェックを行い、呼び出しが正しいことを保証します.その隠れた危険性と限界を解消した.
  • マクロ定義はクラスメンバーには使用できません.thisポインタのない場所で、inlineはクラスメンバーに使用できます.

  • 6、まとめ
    インライン関数は性能を増強する妙薬ではない.関数が非常に短い場合にのみ、私たちが望んでいる効果を得ることができます.しかし、関数が短くなく、多くの場所で呼び出されると、実行可能プログラムのボリュームが増大します.インライン関数がパフォーマンスを向上させることができない場合は、それを使用しないでください.
    もう一つ:releaseデバッグのとき、inline関数のブレークポイントは無効です.結局、存在しない関数内にブレークポイントを設定することに相当します.Debugバージョンではinliningが禁止されているため、debugバージョンでは問題はありません.
    皆さん、ありがとうございます.頑張っているふりをしているヤングヤングです.
    参考資料:https://blog.csdn.net/hejjunlin/article/details/78239277 https://www.cnblogs.com/fnlingnzb-learner/p/6423917.html