右值引用与移动构造详解

右值引用与移动构造

  • 这节我们来详细的介绍一下什么是左值引用,什么是右值引用,以及为什么要引入右值引用,还有就是c++11非常重要的特性 -> 移动构造

左值引用和右值引用

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可能可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左 值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。左值引用与右值引用一样,一旦引用了一个对象就不能再引用另外一个对象

右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引 用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能 取地址。右值引用就是对右值的引用,给右值取别名。这里注意,右值出了字面常量以外,都可以理解是一些临时变量 -> 非左值引用返回值之类的

  • 注:这里有一个很容易混淆的点,就是右值引用引用的是一个右值,但是这个变量本身是一个左值
int main()
{double x = 1.1, y = 2.2;int&& rr1 = 10;const double&& rr2 = x + y;rr1 = 20;cout << &rr1 << endl;rr2 = 5.5;  // 报错return 0;
}
  • 这里的rr1是一个左值,它是可以取出地址的,然后rr1=20不是重新绑定一个右值,而是修改其所绑定的右值。

右值引用的使用场景

  • 为什么要引入右值引用 -> 为了解决一些左值引用没有完全解决的问题

​ 左值引用解决了传参,和传值返回的问题,但是对于传值返回的问题没有完全解决

->如果返回的是一个局部作用域的对象就不能使用引用返回,但是使用传值返回的话就会进行一份深拷贝,这对于追求极值性能的c++来说不是很可取,所以因右值引用而产生的移动构造就起了作用,它可以很好的解决传值返回深拷贝的问题

  • 为什么:因为右值引用往往是临时变量,临时变量一般出了作用域就会进行销毁,那既然你都要销毁了,如果我还要照着你的资源进行一份深拷贝岂不是太浪费了,所以我们可以使用移动构造 -> 其实就是进行资源的转移,将原来要销毁的值转移给要拷贝的值。

对于下面的代码

	bit::string to_string(int value){bool flag = true;if (value < 0){flag = false;value = 0 - value;}bit::string str;while (value > 0){int x = value % 10;value /= 10;str += ('0' + x);}if (flag == false){str += '-';}std::reverse(str.begin(), str.end());return str;}int main(){bit::string s1;s1 = bit::to_string(1234);return 0;}

如果没有移动构造的话,结果是这样的

candy:~/code/cpp/test/grammar $  ./demo.exe 
string(char* str)
string(char* str)
string(const string& s) -- 深拷贝
string& operator=(const string& s) -- 深拷贝

​ 这是在没有编译器优化的情况下,如果有优化会把这次拷贝构造(这是将str拷贝给临时对象用的)去除掉,只剩一次赋值,但还是深拷贝,性能并不高。

移动构造

		// 移动构造// 临时创建的对象,不能取地址,用完就要消亡// 深拷贝的类,移动构造才有意义string(string&& s){cout << "string(string&& s) -- 移动拷贝" << endl;swap(s);}//移动赋值string& operator=(string&& s){cout << "string& operator=(string&& s) -- 移动拷贝" << endl;swap(s);return *this;}

​ 通过对移动构造和赋值的观察我们可以知道,这就是对一个右值(将亡值)进行资源的交换,这样就可以避免深拷贝,从而大大的提高效率

candy:~/code/cpp/test/grammar $  ./demo.exe 
string(char* str)
string(char* str)
string(string&& s) -- 移动拷贝
string& operator=(string&& s) -- 移动拷贝

这是有移动构造的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot 整合Elasticsearch

1 java操作ES方式 1.1 操作ES 9300端口(TCP) 但开发中不在9300进行操作 ES集群节点通信使用的也是9300端口如果通过9300操作ES&#xff0c;需要与ES建立长连接 可通过引入spring-data-elasticsearch:transport-api.jar不在9300操作原因&#xff1a;1.springboot版本不同&…

Spring Core——资源加载与访问(Resource)

Spring 中的资源加载 在Spring框架中&#xff0c;Resource接口用于简化和统一对各种底层资源&#xff08;如xxx.xml、application.yml、application.properties等文件、类路径资源、URL等&#xff09;的访问。它提供了一个通用的抽象层&#xff0c;使开发者无需关注不同资源类…

Cloud Native 安全实践解析

Cloud Native 安全实践解析 一、Cloud Native概述 Cloud Native&#xff08;云原生&#xff09;是一种构建和运行应用程序的方法&#xff0c;它充分利用了云计算的弹性、可扩展性和多租户特性。云原生应用通常被设计成微服务架构&#xff0c;利用容器化技术进行部署和管理&am…

springboot电影院线上购票系统-计算机毕业设计源码68220

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统流程分析 2.2.1 添加信息流程 2.2.2 修改信息流程 2.2.3 删除信息流程 2.3 系统功能分析 2.…

Fireflyrk3288 ubuntu18.04添加Qt开发环境、安装mysql-server

1、创建一台同版本的ubuntu18.04的虚拟机 2、下载rk3288_ubuntu_18.04_armhf_ext4_v2.04_20201125-1538_DESKTOP.img 3、创建空img镜像容器 dd if/dev/zero ofubuntu_rootfs.img bs1M count102404、将该容器格式化成ext4文件系统 mkfs.ext4 ubuntu_rootfs.img5、将该镜像文件…

起薪4万的AI产品经理自述:一个算法模型是怎么训练出来的?

起薪4万的AI产品经理自述&#xff1a;一个算法模型是怎么训练出来的&#xff1f; 这篇文章&#xff0c;我们继续来讲模型构建的其他 3 个环节&#xff1a;模型训练、模型验证和模型融合。 模型训练 模型训练是通过不断训练、验证和调优&#xff0c;让模型达到最优的一个过程。…

切割01串问题(dp动态规划问题)

题目概述&#xff1a; 给定一个长度为 &#x1d45b; 的 01 串&#xff0c;定义如下操作为一次 “切割”&#xff1a; 将长度大于 1 的字符串分割为两个非空的连续字串&#xff0c;记分割出来的左侧字串 a 中 0 的出现次数为 C 0 C_0 C0​&#xff0c;右侧字串 b 中 1 出现的…

ChatGPT:Java 的文档标准 OAS 是什么的缩写

ChatGPT&#xff1a;Java 的文档标准 OAS 是什么的缩写 OAS 是 “OpenAPI Specification” 的缩写。OpenAPI Specification 是一个用于描述和定义 RESTful APIs 的标准。最初由 Swagger 开发&#xff0c;现在由 OpenAPI Initiative 维护。OAS 使用一种标准的格式&#xff08;通…

【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅

文章目录 前言一、人工智能1. 人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例 2.人工智能发展历程a.人工智能的起源b.发展历程 3.人工智能的主要分支 二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程 2.机器学习算…

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统

一、前言 1.1 项目介绍 【1】项目功能介绍 随着我国老龄化进程的加快,养老问题日益突出,如何有效保障老年人的生活质量与安全成为社会关注的重点。智能化、信息化技术的发展为解决这一问题提供了新的思路和手段。基于Linux系统的智能养老院出入管理系统应运而生,为了实现…

Thinkphp仿华为商城源码/红色风格电脑手机数码商城系统网站源码

Thinkphp仿华为商城&#xff0c;主要实现了商品首页展示、用户意见、商品分类列表、商品搜索、商品详细展示、购物车、订单生成、在线付款、以及个人中心完善个人资料、用户修改收货地址、余额查询、消费查询、订单管理、商品评价、热销商品和最近商品浏览&#xff1b; 后台是…

大模型的架构演进史——为什么Decoder-Only成为最终的胜利者

文章目录 大模型的架构encoder onlydecoder nolyencoder-decoder为什么现在decoder-only为主流 大模型的架构 encoder only 使用encoder-only的模型主要的思路是通过编码器&#xff0c;将大量文本、时序数据等资料进行编码、压缩&#xff0c;达到进一步抽象理解输入数据的能力…

WEB前端12-axios基础

Vue2-axios基础 1.axios基本概念 在现代的前端开发中&#xff0c;处理网络请求是至关重要的一部分。Axios 是一个流行的基于 Promise 的 HTTP 客户端&#xff0c;它可以在浏览器和 Node.js 环境中使用。它的设计简单易用&#xff0c;支持并行请求、拦截器、CSRF 防护等特性&a…

【JavaScript】函数的动态传参

Javacript&#xff08;简称“JS”&#xff09;是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名&#xff0c;但是它也被用到了很多非浏览器环境中&#xff0c;JavaScript基于原型编程、多范式的动态脚本语言&…

Linux 常用命令之文件处理

Linux 文件处理命令指南 文件查看命令 cat (Concatenate and display files) # 显示文件内容 cat file.txt# 显示多个文件的内容 cat file1.txt file2.txt# 将文件内容合并并输出到新文件 cat file1.txt file2.txt > combined.txt# 以行号显示文件内容 cat -n file.txtta…

写代码对人的影响

1 代码是需要跑起来的&#xff0c;不能你写了一段代码运行不了 2 代码过程中有大量的bug&#xff0c;经常异常报错&#xff0c;你需要花费时间去解决 对人的影响就是解决问题的态度得到强化&#xff0c;解决问题要比坚持正确困难&#xff0c;坚持正确只是需要自然而然的努力&…

淘宝NPM镜像地址已经改了,2022年以前发布的相关内容的博文已经没参考价值

http://npm.taobao.org和 http://registry.npm.taobao.org 已于2022.06.30正式下线和停止DNS解析 淘宝NPM镜像站的新域名为 http://npmmirror.com http://registry.npm.taobao.org > https://registry.npmmirror.com windows系统在命令行窗口下执行如下命令即可&#xff1a…

C++ primer plus 第16章string 类和标准模板库, 算法的通用特征

C primer plus 第16章string 类和标准模板库, 算法的通用特征 C primer plus 第16章string 类和标准模板库, 算法的通用特征 文章目录 C primer plus 第16章string 类和标准模板库, 算法的通用特征16.6.2 算法的通用特征 16.6.2 算法的通用特征 正如您多次看到的&#xff0c;…

掌握SQL Server的PowerShell魔法:自动化数据库管理的艺术

掌握SQL Server的PowerShell魔法&#xff1a;自动化数据库管理的艺术 SQL Server与PowerShell的结合为数据库管理员(DBA)提供了一种强大的自动化数据库管理工具。通过PowerShell&#xff0c;可以执行复杂的数据库任务&#xff0c;从简单的查询到复杂的数据迁移和备份策略的实现…