C++相談室 part101
■ このスレッドは過去ログ倉庫に格納されています
0772764 765
2013/05/05(日) 04:35:06.97後者は
1.get_string関数内でstringオブジェクトを生成。
2.get_string関数内から関数外部にオブジェクトをコピーするために
コピーコンストラクタもしくは代入演算子のオーバロードが実行される。
(受け取る側のオブジェクトが既に初期化されているかどうかによる。)
3.get_string関数内のstringクラスのオブジェクトがデストラクタで削除される。
コンパイラが愚直に解釈すると上記3ステップが実行されることになるため、動作効率が
悪くなってしまう。
C++03ではコンパイラが
・RVO(戻り値最適化の促進)
・NRVO(名前付きオブジェクトの戻り値最適化の促進)
という仕様に対応していれば上記3ステップを、get_string関数外でstringオブジェクト
を直接生成するという1ステップに置き換えられるため、無駄なstringオブジェクトの
コピーと削除が行われなくなるので動作効率の低下は起こらない。但しこれは最適化
してもいいよという仕様であり、必ずそうしなければならないと言うものでは無いため、
最終的にはコンパイラに依存していた。
C++11だと右辺値参照があるため、委譲コンストラクタ、委譲代入演算子のオーバロードが
定義されているクラスなら、RVO、NRVOが効かなかったとしても無駄なコピーは発生しない。
但しget_string関数内のstringクラスのオブジェクトのデストラクタは実行されてしまうので
わずかながら効率が低下するから、RVO、NRVOが効く場合はそちらが優先される。
コンパイラがC++03ならRVO、NRVOが効いているかを考慮する、C++11なら何も気にせず後者で書く。
■ このスレッドは過去ログ倉庫に格納されています