2017-08-12 7 views
2
#include <iostream> 
using namespace std; 

class A { 
public: 
    A() { 
     cout << "A()" << endl; 
    } 
    A(const A& a) { 
     cout << "A(const A& a)" << endl; 
    } 
    A(A&& a) { 
     cout << "A(A&& a)" << endl; 
    } 
    A& operator=(const A& a) { 
     cout << "operator=(const A& a)" << endl; 
     return *this; 
    } 
    A& operator=(A&& a) { 
     cout << "operator=(A&& a)" << endl; 
     return *this; 
    } 
    ~A() { 
     cout << "~A()" << endl; 
    }; 
}; 

A foo() { 
    A a; 
    return a; 
} 

int main() { 
    A a = foo(); 
} 

コンパイルで変数を返す:構築およびローカル変数の消滅とC++

clang++ test.cpp -o test -std=c++11 

出力:

A() 
~A() 

ただ一つのペア()と〜Aがあるのはなぜ()出力に?

なぜ移動コンストラクタが呼び出されないのですか?

いくつかのコード最適化を行ったことはありますか?

答えて

6

Copy Elisionのためにコンストラクタが呼び出されていません。 コンパイラは戻り値の場所にローカル変数を直接構築しました。

このような最適化は、RVO(Return Value Optimization)とも呼ばれます。

コンパイラがこのような最適化を可能にするための条件があります。これらの条件については、「標準」で説明しています。しかし、それはより便利に、これらの条件に関するEffective Modern C++ by Scott Meyersの項目25を引用することがあり(標準のようにそれほど厳密ではない情報、多分、より効率的に吸収する):

を標準の律法主義の(間違いなく有毒)散文を言い換え、[ ...]コンパイラは、(1)ローカルオブジェクトの型が関数によって返されたものと同じであり、(2)ローカルオブジェクトのコピー(または移動)が、値によって返される 関数の中で、ローカルオブジェクトは返されているものです。

関連する問題