std::moveは何をしましたか.

3083 ワード

std::moveはオブジェクトを可変右値オブジェクトとしてマークします.
A a1;
A a2 = std::move( a1 );

2行目の文は、移動コピー構造(move constructor)および移動付与演算子(move assigment operator)関数を実行します.
  • sizeof(A)サイズのメモリを作成します.
  • a 1のコンテンツをこのメモリにコピーする.
  • a 1の有効メモリが破棄されました.

  • 注:move-constructorをカスタマイズしない場合は、デフォルトのcopy-constructorが呼び出されます.オブジェクトにスタックメモリ管理がある場合は、move-constructorを定義する必要があります.
    次の例を示します.
    test関数の
  • 最初の文は、a呼び出しコンストラクタがオブジェクトを作成したことに相当する.
  • 2番目の文は、getA 2に一時オブジェクトを作成し、Aのmove-constructorを呼び出してbを作成し、一時オブジェクトを破棄する.
  • 3番目の文は、move-constructorを強制し、全体的に同じ文2
  • 4番目の文、std::moveのパラメータがA&&&であれば、何もしないことに相当するので、文2と同じです.
  • A getA1( )
    {
        return A();
    }
    A getA2( )
    {
        A a;
        a.x = 123;
        a.y = 456;
    }
    void test( )
    {
        A a = getA1( );
        A b = getA2( );
        A a = std::move( getA1( ) );
        A b = std::move( getA2( ) );
    }

    カスタムmove-constrctorおよびmove-assigment-operatorサンプル
    struct Thing
    {
    	Thing()
    		: _data(new int[100])
    	{
    		std::cout << "default construct
    "; } // Copy operator Thing(const Thing& other) : _data(new int[100]) { std::cout << "copy constructor
    "; memcpy(_data, other._data, sizeof(int) * 100); } // Move constructor Thing(Thing&& other) noexcept : _data(other._data) { std::cout << "move constructor
    "; other._data = nullptr; } // assignment operator Thing& operator=(const Thing& rhs) { std::cout << "copy operator
    "; if (&rhs != this) { Thing tmp(rhs); std::swap(*this, tmp); } return *this; } // move assignment operator Thing& operator=(Thing&& rhs) noexcept { std::cout << "move operator
    "; std::swap(_data, rhs._data); return *this; } // destructor necessary since we are working in dangerous new/delete territory ~Thing() noexcept { std::cout << "destructor " << (_data ? "object has data" : "object is empty") << "
    "; delete[] _data; } private: int* _data; }; int main() { std::cout << "constructing a
    "; Thing a; std::cout << "constructing b with copy of a
    "; Thing b(a); std::cout << "moving a to newly constructed c
    "; Thing c(std::move(a)); std::cout << "moving c back to a
    "; a = std::move(c); std::cout << "create a new d
    "; Thing d; std::cout << "replace d with a copy of a
    "; d = a; return 0; }

    出力:
    constructing a default construct constructing b with copy of a copy constructor moving a to newly constructed c move constructor moving c back to a move operator create a new d default construct replace d with a copy of a copy operator copy constructor move constructor move operator move operator destructor object is empty destructor object has data destructor object has data destructor object is empty destructor object has data destructor object has data