RVO(Return Value Optimization)2009/04/07 22:16

C++ では、俗に言う戻り値の最適化があります。これは、戻り値のコピー渡しによる非効率を避けるための方法です。その流れで、以下のようなコードを見つけました。

using namespace std;

class AAA{ public: AAA(){ cout << "AAA" << endl; } ~AAA(){ cout << "BYE" << endl; } };

void foo( AAA aaa ){

cout <<"FOO END" << endl; }

int main() { foo( AAA() ); // ここがポイント } AAA() と書いてあるところがポイントでこれをすることで、コピー渡しとはならずに、foo関数の引数を直接作成することができるそうです。ただ、このサンプルを動作させると、何故か、クラスAAAのデストラクタが2回呼び出されてしまいました(コンストラクタは1回のみ)。ううむ。不思議だ。と、非常に困っている雲でした。