#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的位置上
*/