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;

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号