C++中引用的本质即是指针. 当申明一个指向其它变量的引用时, 比如int b = &a,编译器偷偷地创建了一个变量,该变量会存储其引用的对象(a)的指针。并且一切对变量b操作,都变转变为对a指针的操作。然而编译器屏蔽了这一切,让使用者感觉一切都是“免费”的。
#include <stdio.h>
int main()
{
int a = 10;
int &b = a;
int *c = &b;
b = 11;
return 0;
}
//对应x86上汇编代码
push %rbp
mov %rsp,%rbp
movl $0xa,-0x14(%rbp) //*(rbp -0x14) = 0xa ,即(a = 10)
lea -0x14(%rbp),%rax //rax = rbx - 0x14
mov %rax,-0x8(%rbp) //*(rbp - 0x8) = rax
mov -0x8(%rbp),%rax // rax = *(rbp - 0x8), 即rax = rbx - 0x14
mov %rax,-0x10(%rbp) //*(rbp -0x10) = rax, 即*(rbp - 0x10) = rbx - 0x14
mov -0x8(%rbp),%rax //rax = *(rbp - 0x8), 即 rax = rbp - 0x14
movl $0xb,(%rax) //*rax = 0xb , 即*(rbp - 0x14) = b
mov $0x0,%eax
pop %rbp
栈上的空间如下: