程序员笔记 (四十九)std:move()


aihuafeng66t
克里斯蒂亚诺诺 2024-01-12 14:10:34 63763 赞同 0 反对 0
分类: 资源 标签: 运维
程序员笔记 (四十九)std:move()

(一)C++11中std:move()的作用和用法

功能:返回传入参数的右值引用。右值引用的概念是在C++11才提出来的。在此之前只有一种引用。

优点:调用此函数不会引起任何数据争用。

通常,右值是其地址无法通过解引用获得的值,因为它们是文字或本质上是临时的(例如,函数或显式构造函数返回的值)。通过将对象传递给此函数,可以获得引用该对象的右值。

标准库的许多组件都实现了移动语义,允许直接转移对象的资产和属性的所有权,而在参数为右值时无需复制它们。

要注意-在标准库中-移动意味着从中移出的对象处于有效但未指定的状态。这意味着在执行此操作后,仅应销毁移出对象的值或为其分配新值;否则访问它会产生未指定的值。

(二)

那么std::move是如何避免内存拷贝的呢?看它的实现发现,std::move只是进行了左右值的转换,也就是类型的转换,并没有改变对象本身。

这里涉及到左值和右值的概念:

左值:简单理解为赋值运算符左边的变量,可以接受右边值,例如 int a = 10; a就是一个左值

右值:赋值运算符右边的值,这个值可以是一个变量页可以是一个常量,例如 int a = 10; 10就是一个右值,并且是个常量。

了解了左值和右值的区别,那么std::move将一个左值转换成右值,为什么就可以避免内存拷贝?实际上这里的避免内存拷贝依赖于被std::move转换的对象的具体实现,std::move只是将对象以右值的形式告诉接受者,这个对象的赋值操作可以直接使用其内存地址,而不是创建新内存拷贝数据。

 

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
克里斯蒂亚诺诺L1
粉丝 0 资源 831 + 关注 私信
最近热门资源
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD  40
统信uos安装mysql的实例参考  31
分享解决宏碁电脑关机时自动重启的方法  30
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。  29
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作  28
统信uosboot区分未挂载导致更新备份失败  27
格之格打印机dp3300系列国产系统uos打印机驱动选择  25
以openkylin为例编译安装内核  23
最近下载排行榜
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD 0
统信uos安装mysql的实例参考 0
分享解决宏碁电脑关机时自动重启的方法 0
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。 0
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作 0
统信uosboot区分未挂载导致更新备份失败 0
格之格打印机dp3300系列国产系统uos打印机驱动选择 0
以openkylin为例编译安装内核 0
作者收入月榜
1

prtyaa 收益400.53元

2

zlj141319 收益237.46元

3

哆啦漫漫喵 收益231.42元

4

IT-feng 收益219.71元

5

1843880570 收益214.2元

6

风晓 收益208.24元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!