1.「それはなんですか?」
一方でstd::move()
、技術的機能である-私は言うでしょう、それはないです、本当に機能。これは、コンパイラーが式の値を考慮する方法の間の一種のコンバーターです。
2.「それは何をしますか?」
最初に注意すべきことstd::move()
は、実際には何も動かないということです。式を左辺値(名前付き変数など)からxvalueに変換します。xvalueはコンパイラーに指示します。
あなたは私を略奪し、私が持っているものを移動し、他の場所で使用することができます(とにかく私はすぐに破壊されるので)」。
つまり、を使用std::move(x)
すると、コンパイラが共食いできるようになりますx
。したがってx
、たとえば、メモリ内に独自のバッファがある場合- std::move()
コンパイラを実行すると、代わりに別のオブジェクトがそれを所有できます。
また、prvalueから移動することもできます(一時的なものなど)。これはほとんど役に立ちません。
3.「いつ使用する必要がありますか?」
この質問をするもう1つの方法は、「既存のオブジェクトのリソースを何のために共食いできるか」です。まあ、もしあなたがアプリケーションコードを書いているなら、おそらくコンパイラーによって作成された一時的なオブジェクトをたくさんいじることはないでしょう。したがって、主に、コンストラクター、演算子メソッド、標準ライブラリアルゴリズムのような関数など、オブジェクトが自動的に大量に作成および破棄される場所でこれを行います。もちろん、それは単なる経験則です。
典型的な用途は、コピーではなく、あるオブジェクトから別のオブジェクトにリソースを「移動」することです。@Guillaumeはこのページにリンクしています。このページには簡単な短い例があり、コピーを少なくして2つのオブジェクトを交換します。
template <class T>
swap(T& a, T& b) {
T tmp(a); // we now have two copies of a
a = b; // we now have two copies of b (+ discarded a copy of a)
b = tmp; // we now have two copies of tmp (+ 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
いる、と言う、vector<int>
サイズのn個。最初のバージョンでは3 * n要素を読み書きし、2番目のバージョンでは基本的に、ベクトルのバッファーへの3つのポインターと3つのバッファーのサイズだけを読み書きします。もちろん、クラスT
は移動の方法を知っている必要があります。これを機能させるには、クラスに移動割り当て演算子とクラスの移動コンストラクターが必要T
です。