RVOの最適化

RVO -戻り値の最適化
概要
戻り値の最適化(略してRVOの戻り値の最適化は、)コンパイラの最適化のメカニズムであります:

この関数は、彼らが一時オブジェクトを作成した場合、ユーザーを返すとき、その後、一時オブジェクトの消費は(コンストラクタ)コンストラクタを呼び出すオブジェクトを返す必要があり、コンストラクタの呼び出し(コピーコンストラクタ)とデストラクタ(デストラクタコピーするとき)の呼び出しのコスト。マイナーな最適化を行う場合、コストはこのように、コールコピーコンストラクタとデストラクタシーケンスをコールする必要がなくなり、コンストラクタ関数のコストに抑えることができます。

例で見てみましょう

書式#include <iostreamの>
 使用して 名前空間はstdを、

クラス合理
{ 
パブリック
    合理的(INT分子= 0INT分母= 1 ):N(分子)、D(分母){ 
          COUT << " コンストラクタと呼ばれる... " << ENDL。
    }

    合理(){ 
          COUT << " デストラクタが呼び出され... N:" << N << " D:" << D << ENDL。
合理&{)RHS
           この - > D = rhs.d。
          この - > N = rhs.n。
          裁判所未満 << " コピーコンストラクタが呼び出され... " << てendl; 
    } 

    int型の分子()のconst { 戻りN。}
     INT分母()のconst { 戻りD。}
 プライベートint型nは、D; 
}。

constの合理的な演算子 *(constの合理&LHS、constの合理& RHS){
    COUT<< " -----------演算子を入力します* ----------- " << てendl; 
    合理TMP(lhs.numerator() * rhs.numerator()、
        lhs.denominator() * rhs.denominator())。
    裁判所未満 << " -----------休暇演算子* ----------- " << てendl;
    リターンTMP; 
} 

int型のmain(int型 ARGC、チャー ** ARGV)
{ 
    合理X(15)、Y(29 )。
    合理Z = X *Y; 
    COUT << " CALC結果:" << z.numerator()
         << " / " << z.denominator()<< ENDL。

    リターン 0 ; 
}

使用gcc4.8.4ラン:

...呼び出さコンストラクタ
コンストラクタ呼び出され...
 -----------入力します演算子を * ----------- 
コンストラクタと呼ばれます...
 ---------- -脱退演算子 * ----------- 
CALC結果:2 / 45 
と呼ばれるデストラクタ... N:2D:45 
と呼ばれるデストラクタ... N:2D:9 
N ...呼び出さデストラクタ:1D:5
TMPオブジェクトと、それはgcc4.8.4のRVOの最適化がデフォルトで有効になって判明した理由である、近くで見てみましょうを生成し、破壊しない、使用 -fno-Elideの-コンストラクタ
> G ++ -fno-elide- コンストラクタのmain.c 
 > ./a。うちの 
コンストラクタが呼び出され... 
コンストラクタが呼び出され...
 -----------入力オペレータ * ----------- 
コンストラクタと呼ばれます...
 --------- -休暇演算子 * ----------- 
コピーコンストラクタが呼び出され... 
デストラクタと呼ばれる... N:2D:45 
のコピーコンストラクタと呼ばれる... 
デストラクタと呼ばれる... N:2D:45 
CALC結果:2 / 45 
と呼ばれるデストラクタ... N:2D:45 
デストラクタ呼び出さ... N:2D:9 
デストラクタ呼び出さ... N:1D:5

これは、フォームの我々の理解です。

 

おすすめ

転載: www.cnblogs.com/vczf/p/12604695.html