RVO -戻り値の最適化
概要
戻り値の最適化(略してRVOの戻り値の最適化は、)コンパイラの最適化のメカニズムであります:
この関数は、彼らが一時オブジェクトを作成した場合、ユーザーを返すとき、その後、一時オブジェクトの消費は(コンストラクタ)コンストラクタを呼び出すオブジェクトを返す必要があり、コンストラクタの呼び出し(コピーコンストラクタ)とデストラクタ(デストラクタコピーするとき)の呼び出しのコスト。マイナーな最適化を行う場合、コストはこのように、コールコピーコンストラクタとデストラクタシーケンスをコールする必要がなくなり、コンストラクタ関数のコストに抑えることができます。
例で見てみましょう
書式#include <iostreamの> 使用して 名前空間はstdを、 クラス合理 { パブリック: 合理的(INT分子= 0、INT分母= 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(1、5)、Y(2、9 )。 合理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
これは、フォームの我々の理解です。