反汇编看一下:
int n = 2;
int main(){
int a = n;
int & b = a;
b = 3;
}
生成可执行文件,反汇编得到:
a.out: file format Mach-O 64-bit x86-64
Disassembly of section __TEXT,__text:
__text:
100000f90: 55 pushq %rbp
100000f91: 48 89 e5 movq %rsp, %rbp
100000f94: 31 c0 xorl %eax, %eax
100000f96: 8b 0d 64 00 00 00 movl 100(%rip), %ecx
100000f9c: 89 4d fc movl %ecx, -4(%rbp)
100000f9f: 48 8d 55 fc leaq -4(%rbp), %rdx
100000fa3: 48 89 55 f0 movq %rdx, -16(%rbp)
100000fa7: 48 8b 55 f0 movq -16(%rbp), %rdx
100000fab: c7 02 03 00 00 00 movl $3, (%rdx)
100000fb1: 5d popq %rbp
100000fb2: c3 retq
_main:
100000f90: 55 pushq %rbp
100000f91: 48 89 e5 movq %rsp, %rbp
100000f94: 31 c0 xorl %eax, %eax
100000f96: 8b 0d 64 00 00 00 movl 100(%rip), %ecx
100000f9c: 89 4d fc movl %ecx, -4(%rbp) //变量a
100000f9f: 48 8d 55 fc leaq -4(%rbp), %rdx
100000fa3: 48 89 55 f0 movq %rdx, -16(%rbp)//引用b,存储a的地址
100000fa7: 48 8b 55 f0 movq -16(%rbp), %rdx
100000fab: c7 02 03 00 00 00 movl $3, (%rdx)
100000fb1: 5d popq %rbp
100000fb2: c3 retq
结论:
从反汇编的结果看,编译器也为引用在栈中分配了空间,存储的是变量a的地址,且和指针变量一样占据8个字节。
通过引用改变变量a的值,编译器从引用获取变量a的地址进行修改。