经常看到网上有人说引用和指针其实是一样,底层都是指针,也没有人来详细分析一下,今天我们来看一看。
int main()
{
int a=10;
int &b=a;
b=20;
}
0x00000000004028de <+0>: push %rbp
0x00000000004028df <+1>: mov %rsp,%rbp
0x00000000004028e2 <+4>: sub $0x20,%rsp
=> 0x00000000004028e6 <+8>: mov %fs:0x28,%rax
0x00000000004028ef <+17>: mov %rax,-0x8(%rbp)
0x00000000004028f3 <+21>: xor %eax,%eax
0x00000000004028f5 <+23>: movl $0xa,-0x14(%rbp) ;int a=10;,这里(%rbp)-0x14保存的是a的地址
0x00000000004028fc <+30>: lea -0x14(%rbp),%rax ;将a的地址保存到rax
0x0000000000402900 <+34>: mov %rax,-0x10(%rbp) ;将a的地址保存到(%rbp)-10 int &b=a;
0x0000000000402904 <+38>: mov -0x10(%rbp),%rax ;将rbp-10里边的内容赋值给rax,这里是b,也就是a的地址
0x0000000000402908 <+42>: movl $0x14,(%rax) ;给rax指向的地址赋值为20(0x14),这里还是a的地址
0x000000000040290e <+48>: mov $0x0,%eax
0x0000000000402913 <+53>: mov -0x8(%rbp),%rdx
0x0000000000402917 <+57>: xor %fs:0x28,%rdx
0x0000000000402920 <+66>: je 0x402927 <main()+73>
0x0000000000402922 <+68>: callq 0x401160 <__stack_chk_fail@plt>
0x0000000000402927 <+73>: leaveq
0x0000000000402928 <+74>: retq
从以上分析来看,对b的各种操作,还是在a的地址上进行的,所以引用的底层其实也就是个指针而已。