引用是c++语言中一个重要的概念,下面主要从汇编的角度来对比指针和引用的不同。
初始化对比:
11: int &b = a;
004133D5 8D 45 F8 lea eax,[a]
004133D8 89 45 EC mov dword ptr [b],eax
12: int *c = &a;
004133DB 8D 45 F8 lea eax,[a]
004133DE 89 45 E0 mov dword ptr [c],eax
上面的代码分别对引用和指针进行初始化,发现两者并不存在差别,解下来我们再来看看赋值操作;
14: b = 4;
004133E1 8B 45 EC mov eax,dword ptr [b]
004133E4 C7 00 04 00 00 00 mov dword ptr [eax],4
17: *c = 5;
00413407 8B 45 E0 mov eax,dword ptr [c]
0041340A C7 00 05 00 00 00 mov dword ptr [eax],5
从汇编代码来看,两者也没有明显的差别,那么我们再来看看对两者的引用:
20: int d = b;
0041342D 8B 45 EC mov eax,dword ptr [b]
00413430 8B 08 mov ecx,dword ptr [eax]
00413432 89 4D D4 mov dword ptr [d],ecx
21: int e = *c;
00413435 8B 45 E0 mov eax,dword ptr [c]
00413438 8B 08 mov ecx,dword ptr [eax]
0041343A 89 4D C8 mov dword ptr [e],ecx
通过代码,我们也没有发现明显的差别。结论:在汇编代码中不存在引用的概念。那到底引用和指针的差别在哪里呢?取决于编译器对两者的不同处理,比如可以有两级指针,但是没有两级引用;可以有空指针,但是引用使用前必须初始化等等。