当前位置: 首页 > news >正文

从汇编的角度揭秘C++引用,豁然开朗

C++中的引用是指已有对象的别名,可以通过该别名访问并修改被引用的对象。那么其背后的原理是什么呢?引用是否会带来额外的开销呢?我们从一段代码入手,来分析一下引用的本质。

#include <stdio.h>
int main()
{int a = 10;int &b = a;b = 11;return 0;
} 

如上所示:定义了一个int型变量a,以及一个int型的引用b,并指向a。最后将b的值修改为11。

我们来看一下它对应的汇编代码:

      1  pushq   %rbp2  movq    %rsp, %rbp        //rbp = rsp 3  movl    $10, -12(%rbp)   //*(rbp-12) = 104  leaq    -12(%rbp), %rax  //rax = rbp - 125  movq    %rax, -8(%rbp)  //*(rbp - 8) = rax6  movq    -8(%rbp), %rax  //rax = *(rbp - 0x8)7  movl    $11, (%rax)     //*rax = 11;8  movl    $0, %eax9  popq    %rbp10  ret

我们来逐行分析:

先来介绍两个寄存器:

rsp:栈顶指针寄存器,rbp:栈基址指针寄存器。前两行push %rbp,以及move %rsp, %rbp。是保存函数调用之前的上下文信息,以及让rbp等于rsp。即此时main函数的栈空间是空的,这两条指令相当于main函数的准备工作。此时main函数的调用栈如下所示:

接下来:movl    $10, -12(%rbp),是将一个立即数写入rbp-12这个地址中,写入栈空间如下所示:

通过对比源代码,发现这条指令对应的是这行:int a = 10。接下来leaq    -12(%rbp), %rax,是将rbp-12的地址加载进rax, 即rax = rbp-12。也就是变量a的地址。接下来movq    %rax, -8(%rbp),即将rax(rax为rbp-12)写入rbp-8这个地址。执行完这条之后,栈上的分布如下:

即将rbp-12存入rbp-8这个地址中。rbp-12即是a的地址。这里其实就是引用的一个实现。接下来:movq    -8(%rbp), %rax,即将rbp-8地址里的内容(即rbp-12)赋值给rax, 即rax = rbp-12。接下来:movl    $11, (%rax) ,即将立即数11赋值给rax所指地址。rax为rbp-12, 那么rbp-12这个地址中的内容将被赋值为11。rbp-12即a的地址,那么执行完这条指令之后,a的值将被更新为11。栈上的分布如下:

对应源码即是b=11。此时,已经完成了通过引用将被引用对像值更新的过程。由此,我们可以看出,C++中引用实现的本质就是指针,即通过存储被引用对象的地址来实现。但是它比指针更加安全,可以认为是一个指针的语法糖。

此文对应的B栈视频如下:

用汇编揭秘C++引用的本质,豁然开朗_哔哩哔哩_bilibili

http://www.lqws.cn/news/99055.html

相关文章:

  • 硬件工程师笔记——555定时器应用Multisim电路仿真实验汇总
  • CRM管理软件的数据可视化功能使用技巧:让数据驱动决策
  • SpringBoot 之 JWT
  • 8.RV1126-OPENCV 视频中添加LOGO
  • Web后端快速入门(Maven)
  • OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤
  • Vert.x学习笔记-Verticle原理解析
  • Java数据校验:确保数据完整性和正确性
  • Modbus转Ethernet IP赋能挤出吹塑机智能监控
  • ChatGPT实战嵌入式开发应用指南与代码演示
  • 笔记本/台式C盘扩容:删除、压缩、跨分区与重分配—「小白教程」
  • 调用.net DLL让CANoe自动识别串口号
  • [Java恶补day14] 56. 合并区间
  • SQL 筛选出在表1但不在表2中的数据
  • Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件
  • 【Redis】set 类型
  • qt控制台程序与qt窗口程序在读取数据库中文字段的差异!!巨坑
  • MySQL 如何判断某个表中是否存在某个字段
  • 基于PostGIS的GeoTools执行原生SQL查询制图实践-以贵州省行政区划及地级市驻地为例
  • React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术
  • 结构性设计模式之Composite(组合)
  • Spring AI 项目实战(一):Spring AI 核心模块入门
  • MongoDB数据库学习
  • 宇树科技更名“股份有限公司”深度解析:机器人企业IPO前奏与资本化路径
  • 业态即战场:零售平台的生意模型与系统设计解构
  • EtherCAT背板方案:方芯半导体工业自动化领域的高速、高精度的通信解决方案
  • 定时器时钟来源可以从输入捕获引脚输入
  • RK3568-移植codesys-runtime
  • 【RabbitMQ】- Channel和Delivery Tag机制
  • 『React』组件副作用,useEffect讲解