从反汇编看引用的本质

 
#include <iostream>
namespace refTest {
void test()
{
int a = 10;
int& b = a;
int &&c = 1;
const int &d = 1; //const 引用可以绑定到一个右值身上
int &&mf = std::move(a);
}
}

上面一段引用的测试用例,我们使用vs2017的反汇编看下引用到底做了什么操作

/*
** 00ADB23D  call        @__CheckForDebuggerJustMyCode@4 (0AA3D33h)
int a = 10;
** 00ADB242  mov         dword ptr [a],0Ah
int& b = a;
** 00ADB249  lea         eax,[a]
** 00ADB24C  mov         dword ptr [b],eax
int &&c = 1;
** 00D72EEF  mov         dword ptr [ebp-30h],1
** 00D72EF6  lea         eax,[ebp-30h]
** 00D72EF9  mov         dword ptr [c],eax
**                const int &d = 1; //const 引用可以绑定到一个左值身上
** 00862EFC  mov         dword ptr [ebp-48h],1
** 00862F03  lea         eax,[ebp-48h]
** 00862F06  mov         dword ptr [d],eax
 
** 下面代码的反汇编
** 0AH(也就是10)放到a的地址中
** 把a的地址放eax寄存中
** 把eax寄存器中的值放到b的地址中
** 总结就是把a的地址存放到b的地址中
** 所以b中存的就是a的地址,&b操作会被编译器翻译成&(*b),取出的地址和&a的值是一样的
** 至于b的地址在哪,不用关心啦。
** 左值引用其实做的事情是一样的 这里可以看出来把1放到了ebp-30h的位置上
 
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值