左值引用、右值引用,std::move() 的汇编解释

news2025/2/23 13:33:59

1:左值引用
引用其实还是指针,但回避了指针这个名字。由编译器完成从地址中取值。以vs2019反汇编:
在这里插入图片描述
如图,指针和引用的汇编代码完全一样。但引用在高级语言层面更友好,对人脑。比如可以少写一个 * 号和 -> 。
,以下是指针和引用的使用:
在这里插入图片描述
以上就是左值引用,引用的必须是具有内存地址的对象,因为要完成引用初始化。
2 :
右值引用,引用的是值。一个变量的符号有两层含义:出现在 = 左边代表变量所在的内存地址。如 a = 3
出现在等号右边代表变量的值,即内存地址里面存储的值。
引入左值引用,右值引用,也是为了区分符号的这两种属性。左值引用的必须具有内存地址,右值引用必须具有值,不能具有地址,比如常量。
在这里插入图片描述
如图,c++ 对右值引用的处理是为这个只有值的常量分配内存,在其中存储常量的值,并把地址传递给右值引用。从高级语言的使用上与 a = 3 没什么区别。而且可见,左右值引用,存储的都是变量的地址,类似于指针。

3 :
但左值引用作为函数参数,触发copy构造函数和赋值运算符=函数。右值引用作为函数参数,触发移动构造函数和移动运算符=函数,实现了不同的语义和功能。移动比复制需要的指令更少,所以程序运行更快。

4:
std:: move() 函数,强制转换左值引用为右值引用。c++ 的语法很有对称性,定下了一个语法规则,再定义一个与本语法相斥的规则。功能很完善。
语法上 :
在这里插入图片描述
最终结果实现了 rLLa 和 rLa 同时对 a 的引用,都指向 a 。修改rLa 为左值引用 int & rLa = a;以编译调试则:
在这里插入图片描述
5 : 解释 std :: move()
该函数的定义如下:其参数是右值引用,返回值还是右值引用,找重点,静态转换的函数先少考虑,一会看汇编,看结果。
在这里插入图片描述
以下是对 move 函数调用的汇编处理,x64的调试环境,现在用32位x86调试就落后了。
在这里插入图片描述
可见: move 函数要求传入的是变量的地址。该函数其实直接把参数中接收的变量地址给返了回去。实现了强制左值为右值。即有内存地址的仍然作为右值引用。
以下就是 move 编译后的汇编代码:
在这里插入图片描述

注意1397行,直接把参数的值返了回去。这是一个变量的地址。
所以结论是:左值引用,右值引用存储的都是变量的地址,都是我们熟知的引用,没有发生语义的变化。
谢谢阅读。反汇编学编程,好办法,

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

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

相关文章

F280049C实现Simulink调制,以及多个PWM实例之间的同步

文章目录 前言基本概念调制发波载波同步问题 前言 最近作实验碰到了载波不同步的问题,以前也有碰到过这个问题,现在终于解决了,做个记录。 为了以示区分,实例指ePWMx,x1,2,3,4,5,6,7,8;通道指ePWMxA/B&am…

如何使用jmeter进行压测

目录 1.概述 2.测试计划、线程组、取样器 3.调试运行 4.请求默认值 5.流量录制 6.模拟时间间隔 7.压力测试 8.报表 1.概述 一款工具,功能往往是很多的,细枝末节的地方也很多,实际的测试工作中,绝大多数场景会用到的也就是…

看大老如何用Postman+Jmeter实现接口实例

一、接口基础 为什么要单独测试接口? 1. 程序是分开开发的,前端还没有开发,后端已经开发完了,可以提前进入测试 2. 接口直接返回的数据------越底层发现bug,修复成本是越低的 3. 接口测试能模拟功能测试不能测到的异常…

数十位高级测工联合讲解Selenium自动化测试框架工作原理

一、Selenium是什么?   用官网的一句话来讲:Selenium automates browsers. Thats it!简单来讲,Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持…

uvm寄存器模型

一、基础知识 前门访问与后门访问是两种寄存器的访问方式。 所谓前门访问, 指的是通过模拟cpu在总线上发出读指令, 进行读写操作。 在这个过程中, 仿真时间( $time函数得到的时间) 是一直往前走的。而后门访问是与前门访问相对的概念。 它并不通过总线进行读写操作, 而是…

2023/5/14周报

目录 摘要 论文阅读 1、标题和现存问题 2、准备知识 3、模型结构 4、实验准备 5、实验结果 深度学习 1、大气数据和水质数据 2、数据清洗 3、项目框架设定 总结 摘要 本周在论文阅读上,阅读了一篇时空图卷积网络:交通预测的深度学习框架的论文。文章的时…

oracle使用with as创建临时表

一、业务需求 在oracle项目的开发过程中,使用sql编写好对应的分析报表内容后,由于sql分析报表涉及到的一些线别丢失,导致呈现的报表分类统计时固定用醒目颜色标识的统计行数据显示错位;因此需要修复分析报表填充完整的线别。 二、…

LeetCode 62 不同路径

题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径&#…

云上高校导航 小程序 开发教程

Gitee仓库:云上高校导航 GitHub仓库:云上高校导航 “云上高校导航”是一套基于小程序云开发的校园导航类系统开发方案,该开发方案可供开发者进行二次开发,用于解决师生和访客的校园出行需求。 项目优势及创新: 使…

Flink 常用API(2)——转换算子+聚合算子

转换算子(Transformation) 映射(map) 用于将数据流中的数据进行转换,形成新的数据流 “一一映射”,消费一个元素就产出一个元素 参数:接口 MapFunction 的实现 方法:map 返回值…

C#串口通信从入门到精通(13)——多个串口发送数据

文章目录 前言1、多串口数据的发送2、源码前言 我们在开发串口通信程序时,有时候会需要连接不止一个串口,这时候该怎么写程序呢?本文就来介绍多个串口数据的发送 1、多串口数据的发送 我们在之前的专栏中介绍了串口数据的发送,当时有提到过,我们是通过创建一个SerialPo…

支付系统设计三:渠道网关设计06-业务处理

文章目录 前言一、业务服务工厂二、业务处理服务1. 业务处理服务2. 业务处理抽象服务3. 流量控制4. 报文提交4.1 获取交易的服务端通讯列表4.2 循环请求支付渠道4.2.1 报文组装4.2.2 报文发送4.2.2.1 协议处理器获取4.2.2.2 构建通讯客户端4.2.2.3 发送请求4.2.2.4 响应报文读取…

【rust】| 06——语言特性 | 所有权

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…

论文/文章/课设 不会写 后端的实现方式?来试试这个吧!

起因 有朋友用了云开发,但是不太会写,老师也不太理解,就来询问我该怎么写(不要苛责老师古板,他们确实不一定能够立刻接受新东西) 用的不是云开发的也适用以下思路 思路 我们把后端开发类比成拧螺丝&…

非煤矿山电子封条 yolov7

非煤矿山电子封条通过yolov7python网络模型技术,非煤矿山电子封条可以对矿山主副井口、风井口、车辆出入口和调度室等全天候不间断实时分析预警,发现人员违规行为及异常设备状态立即告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同,研…

GitSVN区别及选型

1、结论先行 git更适用于纯代码仓库,优势在于分支管理svn则擅长于文件管理,优势在于目录级权限控制 2、版本管理发展历程 3、Git&SVN为何而生 Git出生于2005年,是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版…

LeetCode 63 不同路径 II

题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左…

一款超级简洁的个人博客系统搭建教程(附源码)

开发环境 IDEA、jdk1.8、mysql8.33 开发框架 springboot 1.首先,确保已安装 Git 和 IntelliJ IDEA。如果你还没有安装 Git,请前往官网下载并安装 Git。 2.打开 IntelliJ IDEA,选择 “File” -> “New” -> “Project from Version Con…

Java面试知识点(全)- Java面试基础部分三

[Java面试知识点(全) 导航: https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 ThreadPoolExecutor 如果不了解这个类,应该了解前面提到的ExecutorService,开一个自己的线程池非常方便: Execut…

桂院导航小程序 静态项目 二次开发教程

Gitee代码仓库:桂院导航小程序 先 假装 大伙都成功安装了静态项目,并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了,有提到 我的学校 的文字都改成你自己的就行 1. 全局 app.json…