C++ 引用底层解析
常见错误说法是“引用“自身不是一个变量,甚至编译器可以不为引用分配空间。
引用地址空间存放的是被引用对象的地址。
实际上,引用本身是一个变量,只不过这个变量的定义和使用与普通变量有显著的不同。为了解引用变量底层实现机制,考查如下代码:
int i = 5;
int &ri = i;
ri = 8;
在Visual Studio 2017环境的debug模式调试代码,反汇编查看源码对应的汇编代码的步骤是:调试->窗口->反汇编,即可得到如下原码对应的汇编代码:
int i = 5;
00A013DE mov dword ptr [i],5 # 将文字常量5送入变量i
int &ri = i;
00A013E5 lea eax,[i] # 将变量i的地址送入寄存器eax
00A013E8 mov dword ptr [ri],eax # 将寄存器的内容(也就是变量i的地址)送入变量ri
ri = 8;
00A013EB mov eax,dword ptr [ri] # 将变量ri的值送入寄存器eax
00A013EE mov dword ptr [eax],8 # 将数值8送入以eax的内容为地址的单元中
return 0;
00A013F4 xor eax,eax
它存放的是被引用对象的地址
int i = 5;
int* const pi = &i;
*pi = 8;
按照相同的方式,在VS2017中得到如下汇编代码:
int i=5;
011F13DE mov dword ptr [i],5
int * const pi = &i;
011F13E5 lea eax,[i]
011F13E8 mov dword ptr [pi],eax
*pi = 8;
011F13EB mov eax,dword ptr [pi]
011F13EE mov dword ptr [eax],8
- 只要将pi换成ri,所得汇编代码与第一段所对应的汇编代码完全一样。所以,引用变量在功能上等于一个指针常量,即一旦指向某一个单元就不能在指向别处。
- 在底层,引用变量由指针按照指针常量的方式实现。
int a[3] = { 1, 2, 3 };
int& b = a[0];
b = 4;
cout << a[0] << endl;
struct Test {
int& a;
}
cout << sizeof(Test) << endl; // 8
Test test;
cout << sizeof(test) << endl; // 报错
int a[3] = {1, 2, 3};
int &b = a;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端