main.cpp
#include <iostream>
int var1 = 0;
int main() {
int &var2 = var1;
var2 = 20;
std::cout << var1 << std::endl;
return 0;
}
$ gcc -S main.cpp
main.s
首先,代码是在64位平台上编译的。
第30行处可以看到,编译器在栈中为var2分配了一个局部变量的空间,长度为8(64位指针类型),并将var1的地址保存到其中。
第32行执行赋值,访问rax中保存的地址值指向的内存区域,而此时rax中保存的是var1的地址,实际结果就是var1 = 20。
转换成等价的C代码
#include <iostream>
int var1 = 0;
int main() {
int *var2 = &var1;
(*var2) = 20;
std::cout << var1 << std::endl;
return 0;
}
总之,C++中的引用并没有什么神秘的,它实际上也就是用指针来实现的,只不过引用变量不用像指针变量那样麻烦地使用 & 操作符来获取变量的地址,使用 * 操作符来解引用以及使用 -> 来访问结构体成员而已。只需要当成普通变量来使用,操作的结果便会作用到绑定的原变量上。