4. 引用的本质
1. 引用的底层实现
引用,变量的别名,编译器底层直接用一个指针来实现。这里通过汇编来分析下:
我们根据汇编一步一步来分析:
mov DWORD PTR [rbp-0xc],0xa
:将 10 存入变量[rbp-0xc]
的位置,数值上等于 rbp - 0xc。这里的[rbp-0xc]
就是变量 a。lea rax,[rbp-0xc]
:将变量[rbp-0xc]
也就是 a 的地址加载到 rax,数值上 rax = rbp - 0xc,也就是 rax = &a。mov QWORD PTR [rbp-0x8],rax
:把地址存入到变量[rbp-0x8]
中,也就相当于一个指针 p = [rbp-8],数值上 [rbp-8] = &a,也就是int *p = &a
。mov rax,QWORD PTR [rbp-0x8]
:从 [rbp-0x8] 取出地址到 rax,也就是 rax = &a。mov DWORD PTR [rax],0x8
:写 0x8 到该地址 &a,也就是 a = 8。
汇编指令 | 对应 C++ 语句 | 说明 / 执行效果 |
---|---|---|
mov DWORD PTR [rbp-0xc],0xa | int a = 10; | 在栈上给 a 分配空间并存 10 |
lea rax,[rbp-0xc] | &a | 取 a 的地址到寄存器 rax |
mov QWORD PTR [rbp-0x8],rax | int& ra = a; | 在栈上分配 ra 的位置,并存 a 的地址(引用底层实现) |
mov rax,QWORD PTR [rbp-0x8] | ra | 取出 ra (实际上是 a 的地址)到 rax |
mov DWORD PTR [rax],0x8 | ra = 8; | 通过 rax (即 &a )写 8,最终 a 也被改为 8 |
2. 引用的存储空间
引用在 C++ 中的内部实现是一个 指针常量。因此引用所占用的空间大小与指针相同。(这里是 64 位机器,所以是 8)