移动构造函数形象解释

std::move

std::move() 并不会真正的移动对象真正移动对象的是移动构造函数,移动复制函数等的完成
std::move()只是将参数转换成右值罢了(可以理解为进行了static_cast操作)

这块代码会被移动吗

std::stting str = "test";
string && r = std::move(str);
std::string t(r);

答案是不会的为什么呢
因为c++11内部的形参,即使它被声明为右值引用类型,并被绑定到一个右值引用类型的实参(绑定就是传参)他也无法触发移动函数除非你在次使用move函数或者forward函数;
正确答案如下

std::string t(std::move(r));

移动在内存或者寄存器中的操作是什么,一定比拷贝赋值性能高吗

答案是不一定比拷贝快,平时c++拷贝就是吧原始的内容赋值一遍在清除原始数据打个形象的比喻,你现在有个满满的硬盘要送给你的朋友,c++之前的做法是我买一个新的硬盘给你,把新硬盘赋值好数据一块块拷贝给他,然后在把你的硬盘给毁掉,这块你们发现其实是不是很笨的做法。
其实想想你的硬盘都要销毁了那干嘛不直接送给你朋友得了是把,还要买新硬盘,拷贝数据,毁掉自己的硬盘数据,你说无聊不无聊,所以总结下其实移动函数其实就是转移所有权,在对象方面其实就是转移指针地址所以为什么快我想聪明的你也肯定知道了吧~
但是一定所有的数据都快吗,其实不是的,对于基础类型,或者那种没有new出空间的类型,没有指针这个概念,所以其实移动和拷贝赋值是等同的,没有快也没有满
对于栈上的数据,move是没有意义的,,堆上的东西送来送去没啥问题,栈上的东西可送不得,毕竟出作用域就销毁了

在画个图形象说下
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章