【C++】右值引用和移动语义(带你理解C++为何如此高效)

news2024/12/23 19:21:27

1.右值引用和移动语义

左值和右值的重点区分是能否取地址。

能取地址的是左值(可以是值,也可以是表达式),不能取地址的是右值。

1.1 什么是左值

1.2 什么是右值

1.2.1 常见的右值

常见右值:常数(10),匿名对象,函数返回值(函数返回出去的是个临时对象),x+y这个表达式的结果也是右值。

但是像这种返回的就是个左值,因为它返回的是个左值引用。

补充:匿名对象是右值,有名的是左值。

1.3 右值引用

左值引用就是给左值取别名,右值引用就是给右值取别名。

上图为右值引用。

还可以通过强转的方式让左值引用 引用一个右值

1.4 右值引用的意义

引用的意义:减少拷贝,提高效率。

1.4.1左值引用的场景

左值引用的场景:一个是传引用传参,一个是传引用返回。它们都可以减少拷贝,提高效率。

但是左值引用返回值的问题没有彻底解决:如果返回值是func2中的局部对象,不能用引用返回(因为出了作用域,局部对象要销毁)!

1.4.2移动构造和移动赋值

为了解决这个问题,C++11在构造,拷贝构造的基础上重载出了移动构造:

编译器会自动匹配最合适的一个去调用。

理解移动构造:C++把右值细分为纯右值(内置类型)和将亡值(自定义类型)。而根据上文中介绍的内容我们发现,将亡值的生命周期其实并不长(一般就是其所在的那一行),为了减少拷贝,移动构造其实就是“夺舍”的做法,把将亡值中的数据换给我,把我的数据换给将亡值。这样进行简单的数据交换的效率要比深拷贝的效率高很多很多!这么做几乎可以把拷贝的效率拉到极致,这也是为何C++十分高效的重要原因!(移动赋值也是利用这个原理)。

移动构造和移动赋值提高了传值返回的效率:

图中的str虽然为左值,但是有了移动构造之后,编译器会把它们识别成右值,从而调用移动构造。

有了右值引用重载出来的移动构造,在自定义类型传参时,那些将亡值会走移动构造,将它们的资源转移过去,避免走深拷贝,从而将效率拉到极致。

同样的,有了移动构造和移动赋值之后,编译器会自动把str识别成右值,先调用移动构造,然后再调用移动赋值。

举例:验证移动构造

move可以将左值转化成右值,然后调用移动构造,将str中的资源转移到str1中。

1.4.3补充知识

1.

右值引用本身是左值(s1是左值)。只有右值引用是左值,才能实现资源的交换(移动构造,移动赋值)。

2.

3.

上文所讲的是针对自定义类型中深拷贝的类,因为深拷贝的类才有转移资源的说法,才有效率上的提升。

对于内置类型和浅拷贝的类没有转移资源的说法,效率也不会有提升。

1.5 万能引用

图中的这个模板是万能引用,它可以推导出右边的四个函数。

但是有一个问题:进入函数体中,t全是左值,只能调用Fun的左值引用,不可能调用右值引用。

为了解决这个问题,C++增加了一个东西叫完美转发:

也就是说传左值就不变,传右值会把t转化成右值。

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

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

相关文章

【C/C++】速通某站上的经典“笔试”编程题

【C/C】速通某站上的经典“笔试”编程题 一. 题目描述:解题思路:代码实现: 二. 题目描述:解题思路:代码实现: 三. 题目描述:解题思路:代码实现: 一. 题目描述&#xff1a…

DS线性表之栈的讲解和实现(4)

文章目录 前言一、栈的概念及结构二、关于实现栈的分析关于栈顶指针top关于结构体栈的初始化入栈出栈获取栈顶元素获取栈元素个数判断栈是否为空栈的销毁 总结 前言 栈就是一个比较实用的数据结构了,且大致逻辑就是套用之前的两种线性表 具体选择哪种呢?…

综合布线研究实训室建设方案

1、 引言 随着信息技术的飞速发展,综合布线系统作为信息传输的基础设施,在各类建筑及信息化项目中发挥着越来越重要的作用。为了满足职业院校及企业对综合布线技术人才培养和研究的需求,本方案旨在建设一个集教学、实训、研究于一体的综合布…

ARM base instruction -- smull

有符号乘法运算 Signed Multiply Long multiplies two 32-bit register values, and writes the result to the 64-bit destination register. 将两个32位寄存器值相乘&#xff0c;并将结果写入64位目标寄存器。 64-bit variant SMULL <Xd>, <Wn>, <Wm>…

Linux破解root用户密码

在Linux启动菜单界面按【e】进入编辑启动菜单项 在LANGzh_CN.UTF-8&#xff08;或LANGen_US.UTF-8&#xff09;后面空出一格输入 rd.break consoletty0,再按【ctrlx】键启动Linux系统 以可读写的方式重新挂载文件系统 mount -o remount,rw /sysroot 改变根目录为/sysro…

Attention Is All You Need论文翻译

论文名称 注意力即是全部 论文地址 https://user.phil.hhu.de/~cwurm/wp-content/uploads/2020/01/7181-attention-is-all-you-need.pdf 摘要 主流的序列转导模型基于复杂的递归或卷积神经网络&#xff0c;这些网络包含编码器和解码器。性能最好的模型通过注意力机制将编码器和…

快速学习一个算法,Transformer模型架构

今天给大家分享一个超强的算法模型&#xff0c;Transformer Transformer 模型是目前自然语言处理&#xff08;NLP&#xff09;以及计算机视觉等领域中应用非常广泛的深度学习模型架构。 它由 Vaswani 等人在 2017 年的论文《Attention is All You Need》中提出&#xff0c;并…

【智能大数据分析 | 实验三】Storm实验:实时WordCountTopology

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

并查集的实现(朴素版)

这是C算法基础-数据结构专栏的第二十九篇文章&#xff0c;专栏详情请见此处。 由于作者即将参加CSP&#xff0c;所以到比赛结束前将不再发表文章&#xff01; 引入 并查集是一种可以快速合并查找集合的一种数据结构&#xff0c;这次我们将通过三道题来详细讲解并查集&#xff…

迈普pnsr2900x DOWNLOAD_FILE 任意文件读取漏洞

0x01 产品描述&#xff1a; ‌ 迈普NSR2900X系列是一款专为军队、政府、金融、中小型企业分支机构和中小型企业总部设计的信创接入路由器。‌ 该路由器采用国产核心元器件&#xff0c;基于国产操作系统运行迈普自主研发的网络操作系统及应用软件。它全面支持IPv4、IPv6、OS…

insert into values 语句优化

insert into values插入单行数据 SQL语句&#xff0c;insert into values插入单行数据&#xff0c;执行10万次&#xff0c;执行时间1279秒&#xff0c;优化总体执行耗时。 SQL文本&#xff0c;单行insert values&#xff0c;没有select部分。需要进一步分析执行过程消耗。 ins…

软考《信息系统运行管理员》- 5.1 信息系统数据资源维护体系

5.1 信息系统数据资源维护体系 文章目录 5.1 信息系统数据资源维护体系数据资源维护的管理对象数据资源维护的管理类型运行监控故障响应数据备份归档检索数据优化 数据资源维护的管理内容维护方案例行管理应急响应数据资源的开发与利用 数据是信息系统管理的对象与结果&#xf…

7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡

一、板卡概述 本板卡系我公司自主研发&#xff0c;基于6U CPCI的通用高性能信号处理平台。板卡采用一片国产8核DSP FT-C6678和一片国产FPGA JFM7K325T-2FFG900作为主处理器。为您提供了丰富的运算资源。如下图所示&#xff1a; 二、设计参考标准 ● PCIMG 2.0 R3.0 CompactP…

Python酷库之旅-第三方库Pandas(147)

目录 一、用法精讲 666、pandas.Timestamp.astimezone方法 666-1、语法 666-2、参数 666-3、功能 666-4、返回值 666-5、说明 666-6、用法 666-6-1、数据准备 666-6-2、代码示例 666-6-3、结果输出 667、pandas.Timestamp.ceil方法 667-1、语法 667-2、参数 667…

基础篇:带你打开Vue的大门(一)

学习目标&#xff1a; 理解Vue的基本概念&#xff1a;掌握Vue.js是什么&#xff0c;它的设计理念&#xff0c;以及它在现代Web开发中的应用。掌握Vue的基本语法&#xff1a;学习Vue的基础指令和语法&#xff0c;能够使用Vue构建简单的交互式界面。熟悉Vue组件化开发&#xff1…

DBA | 如何将 .bak 的数据库备份文件导入到SQL Server 数据库中?

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 原文链接&#xff1a;DBA | 如何将 .bak 的数据库备份文件导入到SQL Server 数据库中? 如何将&#xff08;.bak&#xff09;的SQL Server 数据库备份文件导入到当前数据库中? Step 1.登录到 Sql…

Centos7安装RocketMQ[图文教程]

文章目录 RocketMQ介绍基于Linux服务部署RocketMQ&#xff08;单机&#xff09;配置JDK环境下载RocketMQ部署RocketMQ1、解压2、修改VM参数3、配置环境变量4、编写Service文件5、启动服务 基于Docker方式部署RocketMQ安装Docker编写docker-compose文件启动RocketMQ服务 部署Roc…

前端学习-css的背景(十六)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 背景颜色 语法格式 背景图片 语法格式 背景平铺 语法格式 背景图片位置 语法格式 参数代表的意思 参数是方位名词 参数是精确单位 参数是混合单位 背…

架构设计笔记-11-未来信息综合技术

知识要点 云原生架构原则包括&#xff1a;服务化原则、弹性原则、可观测原则、韧性原则、所有过程自动化原则、零信任原则和架构持续演进原则。 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学方式保证的不可篡改和不可…

【项目案例】-音乐播放器-Android前端实现-Java后端实现

精品专题&#xff1a; 01.C语言从不挂科到高绩点 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. SpringBoot详细教程 https://blog.csdn.ne…