C++的引用原理是什么
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍"C++引用原理是什么",在日常操作中,相信很多人在C++引用原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++引用原理是什么"的疑惑有所帮
千家信息网最后更新 2025年01月23日C++的引用原理是什么
这篇文章主要介绍"C++引用原理是什么",在日常操作中,相信很多人在C++引用原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++引用原理是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1、直接定义引用变量
示例代码
#includevoid fun() { int a = 1; int& b = a; b = 10;}int main() { fun(); return 0;}
代码反汇编结果(使用VS反汇编,只看fun函数的代码即可)
#includevoid fun() {00007FF7AAD01920 push rdi 00007FF7AAD01922 sub rsp,40h 00007FF7AAD01926 mov rdi,rsp 00007FF7AAD01929 mov ecx,10h 00007FF7AAD0192E mov eax,0CCCCCCCCh 00007FF7AAD01933 rep stos dword ptr [rdi] // 对变量a进行定义,a的地址为 rsp + 24h, 把这个地址的内容初始化为1 int a = 1;00007FF7AAD01935 mov dword ptr [rsp+24h],1 // 创建变量b,b是a的引用,b 是指向 a 的指针,变量b的地址为 rsp+38h// lea rax,[rsp+24h] 取得变量a的地址,并把地址放到rax寄存器中// qword ptr [rsp+38h],rax 把rax的内容赋给变量b int& b = a;00007FF7AAD0193D lea rax,[rsp+24h] 00007FF7AAD01942 mov qword ptr [rsp+38h],rax // 修改变量b的值的时候,首先取得b中的内容到寄存器中,然后以寄存器中的内容作为地址,修改对应地址的数据// mov rax,qword ptr [rsp+38h] 把 b 的值mov到rax寄存器中// mov dword ptr [rax],0Ah 把地址为rax的内存内容设置为 0AH(10) b = 10;00007FF7AAD01947 mov rax,qword ptr [rsp+38h] 00007FF7AAD0194C mov dword ptr [rax],0Ah }00007FF7AAD01952 mov rcx,rsp 00007FF7AAD01955 lea rdx,[00007FF7AAD09E30h] 00007FF7AAD0195C call 00007FF7AAD01221 00007FF7AAD01961 add rsp,40h 00007FF7AAD01965 pop rdi 00007FF7AAD01966 ret
2、方法参数传引用
示例代码
#includevoid fun(int &a) { a = 10;}int main() { int a = 1; fun(a); std::cout << a << std::endl; return 0;}
代码反汇编结果(从main函数看起)
#includevoid fun(int &a) {// 把 rsp+8 地址的内容设置为寄存器 rcx 中的内容(rcx为请求参数,内容为main函数中定义的变量a的地址)00007FF746531470 mov qword ptr [rsp+8],rcx 00007FF746531475 push rdi // 执行代码 a = 10; 首先取得 rsp+10h 中的值,然后以 rsp+10h 中的值作为地址修改对应内存中的数据 a = 10;00007FF746531476 mov rax,qword ptr [rsp+10h] 00007FF74653147B mov dword ptr [rax],0Ah }00007FF746531481 pop rdi 00007FF746531482 ret // 中间省略一堆垃圾代码int main() {00007FF746531490 push rdi 00007FF746531492 sub rsp,40h 00007FF746531496 mov rdi,rsp 00007FF746531499 mov ecx,10h 00007FF74653149E mov eax,0CCCCCCCCh 00007FF7465314A3 rep stos dword ptr [rdi] // 定义变量a,并把a的值初始化为1, a的地址为 rsp+24h int a = 1;00007FF7465314A5 mov dword ptr [rsp+24h],1 // 调用 fun函数,由于参数较少,因此此函数调用使用寄存器传参// lea rcx,[rsp+24h] 把rcx寄存器的值设置为参数的a的地址// 使用call指令调用 fun 函数 fun(a);00007FF7465314AD lea rcx,[rsp+24h] 00007FF7465314B2 call 00007FF74653107D std::cout << a << std::endl;00007FF7465314B7 mov edx,dword ptr [rsp+24h] 00007FF7465314BB mov rcx,qword ptr [00007FF74653E170h] 00007FF7465314C2 call qword ptr [00007FF74653E158h] 00007FF7465314C8 lea rdx,[00007FF74653108Ch] 00007FF7465314CF mov rcx,rax 00007FF7465314D2 call qword ptr [00007FF74653E160h] return 0;00007FF7465314D8 xor eax,eax }00007FF7465314DA mov edi,eax 00007FF7465314DC mov rcx,rsp 00007FF7465314DF lea rdx,[00007FF746539E40h] 00007FF7465314E6 call 00007FF7465311F9 00007FF7465314EB mov eax,edi 00007FF7465314ED add rsp,40h 00007FF7465314F1 pop rdi 00007FF7465314F2 ret
总结
C ++ 中的引用和指针并无本质区别,只是编译器自动对指针做了取值操作而已
到此,关于"C++引用原理是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
地址
变量
内容
代码
寄存器
函数
原理
C++
参数
学习
指针
内存
数据
方法
更多
示例
结果
帮助
实用
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全工程专业薪资待遇
数据库第一范式理解
软件项目网络技术分析表
进化算法 网络安全
域控服务器如何从机柜上拆下来
消费者数据库技术分析
派出所网络安全定期巡查表
岩土数据库规范编制
东软的软件开发
网络技术对医院的促进
网警网络安全监察知识试题
商邻互联网信息科技有限公司
株洲软件开发培训好不好
mp3数据库文件损坏
wind中国行业数据库
视频管理服务器功率
成都软件开发保证功能怎么用
浙江诚信网络技术咨询成交价
服务器刷新失败
sap链接类型组服务器
软件开发专业技能怎么写
无盘服务器管理系统
国内口腔CADCAM软件开发
第二届国家网络安全宣传
成都互联网科技公司工作好不好
服务器不能自动配置
h2数据库有什么团队在维护
rk3399 用什么软件开发
成都信息平台软件开发
应聘网络安全工程师的目标