ムーブについてなのですが・・・
std::move()は以下のように定義されているようです。
正確にはもう少しわかりにくい記述をしているのですが、GDBでも確認できます。
C++
1template<typename T> 2decltype(auto) move(T&& Param){ 3 using ReturnType = remove_reference_t<T>&&; 4 return static_cast<ReturnType>(Param); 5}
右辺値参照にキャストしているということは、返り値は右辺値ですか?。
・・・??
これでムーブ・・・移動していることになるんですか?
これはただの「右辺値化」ですよね??
右辺値とは名前をもたない一時的なオブジェクトである。
という情報を目にしました。
ということは、ムーブと言うよりは「右辺値化」「一時オブジェクトの生成」ということですよね?
++++++++++++++++++++++++++++++++++++++++++++++++++
疑問なのは、
・なぜこれがコピーより効率が良いと言われているのか??
・なぜこれをムーブと呼ぶのでしょうか??
++++++++++++++++++++++++++++++++++++++++++++++++++
ただの右辺値化ごときで、コピーより高速になる??というのはよく分かりません。
moveの必要性においても疑問がありますね。
例えば、よく使う所有権の移動についてです。
C++
1#include<iostream> 2#include<memory> 3 4void test_func(){ 5 std::unique_ptr<int> ptr(new int); 6 std::unique_ptr<int> wtr(new int); 7 8 *wtr = 20; 9 10 std::cout << *wtr << std::endl; 11 ptr = std::move(wtr); 12 13 *ptr = 40; 14 std::cout << *ptr << std::endl; 15} 16 17int main(){ 18 test_func(); 19 20 return 0; 21}
まぁ・・・普通ですが・・・
この ptr = std::move(wtr); の所有権を移動するときですね。
(ここでも・・・一時オブジェクトを生成しているんですかね? イマイチ一時オブジェクトが生成される場所を把握していなんですが・・・)
GDBで追って見ました。
C++
1operator=(unique_ptr&& __u) noexcept { 2 reset(__u.release()); 3 get_deleter() = std::forward<deleter_type>(__u.get_deleter()); 4 return *this; 5}
これは・・・std::moveが所有権の移動をしているのではなく、std::unique_ptr側で所有権の移動を定義しているんですよね。
moveの定義を見るとただのキャストです。
なので、ムーブを使わなくてもキャストで同じことができるはずです。
C++
1 std::unique_ptr<int> str(new int); 2 str = static_cast<std::unique_ptr<int>&&>(ptr); 3 4 std::cout << *str << std::endl;
できます。
問題なく動作しています。
つまり・・・
このムーブというのは「文法上のだたの見せかけ」に過ぎないのではないでしょうか?
内部動作的に、「ムーブというものは存在しない」ということだと思うのですが・・
そもそもムーブって必要なんでしょうかね??
右辺値化するだけなのであればキャストで良いのでは??
かえってムーブなどあるとわかりにくさが増しそうですが・・・
(ああ、ちなみに、std::unique_ptrのデストラクタは所有権を移動する時に呼ばれるのではなく、関数終了時に呼ばれていました。
所有権を移動して、もう使わなくなったのなら、その時点でデストラクタを呼び出しても良いような気がしますが・・・)
分かる方いたら教えてください。
ムーブと一緒に出てくる右辺値参照については、再度質問いたします。
GCC Linux です。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/06 09:33
2018/03/06 09:41
2018/03/06 09:43
2018/03/06 10:08 編集
2018/03/06 10:24
2018/03/06 10:36 編集
2018/03/06 10:40
2018/03/06 11:44 編集