std::move() とは何ですか? いつ使用すればよいですか? 質問する

std::move() とは何ですか? いつ使用すればよいですか? 質問する
  1. それは何ですか?
  2. それは何をするためのものか?
  3. いつ使用すればよいですか?

良いリンクはありがたいです。

ベストアンサー1

1.「それは何ですか?」

は技術的には関数ですが、実際には関数ではないstd::move()と思います。これは、コンパイラが式の値を考慮する方法のコンバーターのようなものです。

2. 「それは何をするのですか?」

まず最初に注意すべきことは、std::move() 実際には何も動かさないということです。左辺値(名前付き変数など)をx値xvalue はコンパイラに次のことを伝えます。

あなたは私を略奪し、私が持っているものを何でも移動させて他の場所で使用することができます(いずれにせよ私はすぐに破壊されるので)」。

言い換えると、 を使用するとstd::move(x)、コンパイラが を占有することを許可していることになりますx。したがってx、 がメモリ内に独自のバッファを持っている場合、 をstd::move()使用した後、コンパイラは代わりに別のオブジェクトに を所有させることができます。

また、prvalue(一時的に渡しているものなど) ですが、これはほとんど役に立ちません。

3. 「いつ使うべきでしょうか?」

この質問を別の方法で尋ねると、「既存のオブジェクトのリソースを何のために利用するのか」となります。アプリケーション コードを記述している場合、コンパイラによって作成された一時オブジェクトを頻繁に操作することはおそらくないでしょう。したがって、主に、コンストラクタ、演算子メソッド、標準ライブラリ アルゴリズムのような関数など、オブジェクトが自動的に作成および破棄される場所でこれを行います。もちろん、これは単なる経験則です。

典型的な使用法は、コピーではなく、あるオブジェクトから別のオブジェクトにリソースを「移動」することです。@Guillaumeはこのページこれには、2 つのオブジェクトを少ないコピーで交換するという、簡単で短い例があります。

template <class T>
swap(T& a, T& b) {
    T tmp(a);   // we've made a second copy of a
    a = b;      // we've made a second copy of b (and discarded a copy of a)
    b = tmp;    // we've made a second copy of tmp (and discarded a copy of b)
}

move を使用すると、リソースをコピーするのではなく、交換することができます。

template <class T>
swap(T& a, T& b) {
    T tmp(std::move(a));
    a = std::move(b);   
    b = std::move(tmp);
}

Tたとえば、サイズが n の場合に何が起こるか考えてみましょうvector<int>。最初のバージョンでは 3*n 要素を読み書きしますが、2 番目のバージョンでは基本的に、ベクトルのバッファへの 3 つのポインタと 3 つのバッファのサイズだけを読み書きします。もちろん、クラスはT移動方法を知っている必要があります。これが機能するには、クラスに、移動代入演算子とクラスの移動コンストラクターが必要ですT

おすすめ記事