C++中的右值引用和移动语义

在这里插入图片描述

一. 右值引用和移动语义

1.概念

1.1 左值引用是什么

左值是一个表示数据的表达式(如变量名和解引用的指针),我们可以获取它的地址,也可以对它赋值,左值可以出现在赋值符号的左边,右值不可以出现在左边。左引用加const修饰,不能对其赋值,但可取地址,是一种特殊情况。左值引用就是给左值取别名。
左值可以取地址,可以出现在等号左边,可以改变值的大小(const类型除外)。

1.2右值引用是什么

右值也是一个表示数据的表达式,如:字面常量、表达式返回值、传值返回函数的返回值(不能是左值引用返回)等,右值可以出现在赋值符号的右边,但是不能出现在左边。右值引用就是给右值取别名。右值引用是C++11引入的一种新类型的引用,它通过类型后加&&来表示。右值引用可以绑定到右值上,但也可以绑定到左值上(需要std::move来显式转换)。右值引用的主要目的是允许函数或操作以“移动”而不是“复制”的方式处理资源,这通常意味着资源的所有权从源对象转移到目标对象,源对象则变为一个安全可销毁的状态。

1.3 移动语义

移动语义允许对象通过转移其资源(如动态分配的内存)而不是复制它们来初始化或赋值另一个对象。这通常是通过一个特殊的成员函数——移动构造函数和移动赋值操作符来实现的。这两个函数都接受右值引用作为参数,表示它们可以从一个即将被销毁的对象中“窃取”资源。
1.移动构造函数: 接受一个右值引用参数,用于初始化新对象,通过转移源对象的资源而不是复制它们,从而避免不必要的资源分配和复制。
2.移动赋值操作符: 同样接受一个右值引用参数,用于将一个对象的资源转移到另一个已经存在的对象上,并将源对象置于一个可析构的状态。

二.移动构造和移动赋值

1.移动构造

如果既有拷贝构造又有移动构造调用就会匹配调用移动构造,因为编译器会选择最匹配的参数调用。那么这里就是一个移动语义,移动构造本质是将参数右值的资源窃取过来,占位已有,那么就不用做深拷贝了,所以它叫做移动构造,就是窃取别人的资源来构造自己,而移动构造中没有新开空间,拷贝数据,所以效率就提高了

2.移动赋值

编译器会优先返回值当成右值去处理,故移动构造出临时变量,再移动赋值给目标值。

3.总结

移动构造和移动赋值的效率是很高的,它的本质是把右值的资源窃取过来占为己有,就不用再花力气拷贝了。反正右值一般是会快速消失的,即便资源被窃取了也不会有影响。

三.move函数

move:当需要用右值引用引用一个左值时,可以通过move函数将左值转化为右值。C++11中,std::move()函数位于头文件中,该函数名字具有迷惑性,它并不搬移任何东西,唯一的功能就是将一个左值强制转化为右值引用,然后实现移动语义。
但要注意,被强制转化为右值的左值资源可能会被掠夺,掠夺之后不能在使用这些资源,否则会出错。

四.总结

关于右值引用和移动语义的介绍就到此为止,感谢大家的支持,如果文章有错误的地方,各位老铁们评论区指出来(写的可能不是特别好),多多关照,以后会持续更新C++的博客内容,感谢大家的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值