2016-04-15 12 views
0

、オブジェクトが 私は移動コンストラクタを理解しようとしている

をコピーする際、通常はコピーコンストラクタが呼び出される

その私が動きを提供していない場合に発生するものコンストラクタ、

が、私はそれは代わりに私のコピーコンストラクタと呼ばれる移動コンストラクタを追加するときに、ここで

が私のコードです:

#include <iostream> 
#include <vector> 

using namespace std; 

struct A 
{ 
    A() 
    { 
     cout << "A's constructor" << endl; 
    } 

    A(const A& rhs) 
    { 
     cout << "A's copy constructor" << endl; 
    } 

    A(A&& rhs) 
    { 
     cout << "A's move constructor" << endl; 
    } 
}; 

int main() { 

    vector<A> v; 

    cout << "==> push_back A():"; 
    v.push_back(A()); 

    cout << "==> push_back A():" << endl; 
    v.push_back(A()); 

    return 0; 
} 

コンパイラはコードを最適化し、より良い方法を選択しようとしますか?

+0

「** move ** constructor」という名前について考えてみて、その実装を見てみましょう。それは*定数*値の参照として引数をとります。あなたは*定数*値から*移動しますか? –

+1

okだから、私はconst rvalue参照から移動できません。私はコードを更新しました。 – linuxD

+1

@linuxD前回の編集でコピーコンストラクタから 'const'を削除したのですか? –

答えて

6

基本的にはいです。

しかし、これはコンパイラの最適化に関するものではなく、言語自体の最適化方法に関するものではありません。

移動の意味の半分は一時的なものを効率的に使用できるようにすることです。それで、一時的なものが価値評価基準に結びついているのです。そして、それは全体的な意味論のことがどのように働くのかです。一時的ではないが、とにかく何かを動かそうとするときは、std::moveと書いて、右辺値を取得し、これと同じ動作を引き起こします。

とにかく破壊しようとしている一時的なものをコピーすることはありません。

copy/move elisionと連携して、この機能は冗長性の低いコンピューティングになります。

注意は、しかし、あなたの移動のコンストラクタは—ひどく有用ではないであることをあなたは今まであなたがそのconst削除する必要があるだろう(のような、ええと、移動もの)、それは実際に何かを作りたいと思った場合。

2

rvalue参照はconst lvalue参照よりも一時的なものをバインドする方が良い候補です。 (コンパイラの最適化のように)は最適化されていません。実際の最適化は、コピーコンストラクタをまったく呼び出さないことです。

関連する問題