0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c7 45 f4 04 00 00 00 movl $0x4,-0xc(%rbp) -------变量a在栈中的地址-0xc(%rbp),内容存数值4
b: 48 8d 45 f4 lea -0xc(%rbp),%rax
f: 48 89 45 f8 mov %rax,-0x8(%rbp) -------引用b在栈中的地址-0x8(%rbp),内容存储了变量a的地址
13: 48 8b 45 f8 mov -0x8(%rbp),%rax
17: c7 00 07 00 00 00 movl $0x7,(%rax) --------b=7,实际上是将-0x8(%rbp)的内容转换为地址,数值7存放到该地址
1d: b8 00 00 00 00 mov $0x0,%eax
22: 5d pop %rbp
23: c3 retq
由上可见,其实对引用变量存放了被引用变量的地址,对引用变量的操作,其实就是对被引用变量的地址的操作。看到这里是不是有似曾相识的感觉,有点类似于指针概念。修改程序如下:
int main(){
int a = 4;
int &b = a;
int *c = &a;
b=7;
*c=8;
return 0;
}
编译后:
0000000000000000
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c7 45 ec 04 00 00 00 movl $0x4,-0x14(%rbp)
b: 48 8d 45 ec lea -0x14(%rbp),%rax
f: 48 89 45 f0 mov %rax,-0x10(%rbp) -----&b=a
13: 48 8d 45 ec lea -0x14(%rbp),%rax
17: 48 89 45 f8 mov %rax,-0x8(%rbp) -----c=&a
1b: 48 8b 45 f0 mov -0x10(%rbp),%rax
1f: c7 00 07 00 00 00 movl $0x7,(%rax) ----b=7
25: 48 8b 45 f8 mov -0x8(%rbp),%rax
29: c7 00 08 00 00 00 movl $0x8,(%rax) ----*c=8
2f: b8 00 00 00 00 mov $0x0,%eax
34: 5d pop %rbp
35: c3 retq
引用b存放了变量a的地址,指针c也存放了a的地址,但是通过b可以直接对a修改,而通过指针c必须解引用后才能对a修改。度娘里有这么一段说明,对引用求地址,就是对目标求地址,修改代码
int main(){
int a = 4;
int &b = a;
int *c = &a;
b=7;
c=&b;
return 0;
}
编译后
0000000000000000
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c7 45 ec 04 00 00 00 movl $0x4,-0x14(%rbp)
b: 48 8d 45 ec lea -0x14(%rbp),%rax
f: 48 89 45 f0 mov %rax,-0x10(%rbp)
13: 48 8d 45 ec lea -0x14(%rbp),%rax
17: 48 89 45 f8 mov %rax,-0x8(%rbp)
1b: 48 8b 45 f0 mov -0x10(%rbp),%rax
1f: c7 00 07 00 00 00 movl $0x7,(%rax)
25: 48 8b 45 f0 mov -0x10(%rbp),%rax
29: 48 89 45 f8 mov %rax,-0x8(%rbp) -----c=&b
2d: b8 00 00 00 00 mov $0x0,%eax
32: 5d pop %rbp
33: c3 retq