c++学习笔记
左值引用和右值引用
左值和右值的区分标准在于能否获取地址
左值引用
左值的定义表示的是可以获取地址的表达式,它能出现在赋值语句的左边,对该表达式进行赋值
int i = 10;
int &ii = i; // i是个有地址的变量, ii对i进行引用, 访问ii就是直接访问i
int c = i;
int d = ii;
movl $10, -28(%rbp)
leaq -28(%rbp), %rax
movq %rax, -16(%rbp)
movl -28(%rbp), %eax
movl %eax, -24(%rbp)
movq -16(%rbp), %rax
movl (%rax), %eax
movl %eax, -20(%rbp)
四段汇编分别对应了四行代码
汇编分析:
第1行: 把立即数10传送到地址为-28(%rbp)的内存(变量i)上
第2~3行: 把i的地址放到寄存器rax中, 再把rax的内容传送到地址为-16(%rbp)的内存(变量ii)上, 所以对ii的访问就是直接访问变量i的地址上的内容
第4~5行: 把地址-28(%rbp)为的内存(变量i)的内容传送到寄存器eax, 再把eax的内容放到地址为-24(%rbp)的内存(变量c)中
第6~8行: 这里表示对ii变量的使用, 把地址为-16(%rbp)的内存(变量ii)的内容传送到寄存器rax, 再把rax中的值作为内存地址, 把这个内存地址中的值放入到eax寄存器, 再把eax寄存器数据传送到地址为-20(%rbp)的内存(变量d)中, 简单的说, 访问ii, 就是先拿到引用值的地址, 取这个地址上的数据, 把数据传送到目标内存上
右值引用
int &&iii = 10;
int e = iii;
movl $10, %eax
movl %eax, -40(%rbp)
leaq -40(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
movl (%rax), %eax
movl %eax, -28(%rbp)
两段汇编分别对应了两行代码
汇编分析:
第1~4行: 把立即数10放入到寄存器eax中, 把eax的内容放入到地址为-40(%rbp)的内存(为10分配的临时内存)中, 把这个临时内存的地址传送到寄存器rax, 把rax的值传送到地址为-16(%rbp)的内存(变量iii)中
第5~7行: 即访问iii, 就是先拿到引用值的地址, 取这个地址上的数据, 把数据传送到目标内存上
总结:
左值引用和右值引用很类似,
左值引用是用一个变量保存引用的目标的地址, 右值引用是先给右值分配临时栈内存, 再用一个变量访问这块内存