移动构造函数形象解释

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是没有意义的,,堆上的东西送来送去没啥问题,栈上的东西可送不得,毕竟出作用域就销毁了

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

移动构造函数和拷贝构造函数是C++中用于对象复制的两种特殊构造函数移动构造函数用于将一个对象的资源所有权从一个对象转移到另一个对象,而拷贝构造函数用于创建一个新对象并将原对象的值复制给新对象。 在编译器优化的情况下,当一个函数返回一个class对象时,编译器会尝试使用移动构造函数而不是拷贝构造函数来避免不必要的资源复制。这是因为移动构造函数可以直接将原对象的资源指针指向新对象,而不需要进行资源的复制操作,从而提高了性能。 如果程序员没有显式地实现移动构造函数,编译器会默认生成一个移动构造函数。这个默认的移动构造函数会将原对象的资源指针指向新对象,并将原对象的资源指针置为空,以确保原对象不再拥有资源的所有权。 在引用\[2\]中的示例中,Mystring类实现了拷贝构造函数移动构造函数。拷贝构造函数使用深拷贝的方式复制原对象的资源,而移动构造函数则直接将原对象的资源指针指向新对象。 在引用\[3\]中的示例中,函数func返回一个Mystring对象。由于编译器优化的原因,移动构造函数会被调用来将函数内部的Mystring对象的资源所有权转移到str2对象中。因此,str2对象将拥有func函数内部Mystring对象的资源,并可以正常使用。 总结起来,移动构造函数和拷贝构造函数在处理对象复制时有不同的行为。移动构造函数用于将资源所有权从一个对象转移到另一个对象,而拷贝构造函数用于创建一个新对象并复制原对象的值。编译器会尝试使用移动构造函数来提高性能,如果没有显式实现移动构造函数,编译器会默认生成一个移动构造函数。 #### 引用[.reference_title] - *1* *2* *3* [C++学习笔记3:拷贝构造移动构造](https://blog.csdn.net/pdx_ll/article/details/123882008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值