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

















