up:: Cpp
source:: 6.4. ムーブセマンティクス - ゼロから学ぶ C++
メモリ領域節約のためのC++機能。
まずこの式を考える。
std::vector<int> x(1000000);
std::vector<int> y = x; // ディープコピー
// 以降 x は利用しない
この式ではyにxの持つ値std::vector<int>(1000000)
が丸々コピーされているため、計算コストが高くつく。
これを防ぐためには、xの持つ値→yの持つ値 へと、値に付いた変数の名前だけを付けかえればいい。ポインタの出番。
std::vector<int>* x = new std::vector<int>(1000000);
std::vector<int>* y = x; // シャローコピー
x = nullptr;
// 以降 x は利用しない
std::vector<int>(1000000)
を参照するポインタx
を作成。
その後、ポインタだけをyに移した後、xを破棄している。
これで名前だけを差し替えることになり高速に。
ただ、ポインタはバグの温床でありあまり使いたくない。そもそもC++はポインタを使いたくなくて代わりに参照が出来たわけだし。
参照もこういう操作をサポートする、というのが理想。
というわけで出来たのがlvalueとrvalueの分類、そしてstd::move
。
std::vector<int> x(1000000);
std::vector<int> y = std::move(x); // std::move で x を右辺値にキャスト
// 以降、xは利用しない
std::move
の役割はlvalueをrvalueにキャストすること。
xそのものを右辺値、つまり値そのものにすることで、yへの変数付け替えを行う。