以前写C++的时候,我认为指针是就是一个存着另一个变量地址的变量,他是有存储空间的,而引用只是一个变量的别名,不会占用存储空间。
最近在搞汇编,发现下面两段代码的生成的汇编代码是一样的:
指针:
void func()
{
int a = 123;
int *pa = &a;
}
引用:
void func()
{
int a = 123;
int& ra = a;
}
上面两段代码的生成的汇编都是
004019D0 push ebp
004019D1 mov ebp,esp
004019D3 sub esp,8
004019D6 mov dword ptr [ebp-4],7Bh
004019DD lea eax,[ebp-4]
004019E0 mov dword ptr [ebp-8],eax
004019E3 mov esp,ebp
004019E5 pop ebp
004019E6 ret
上面“ebp-4”是a,“ebp-8”实际上就是指针pa或是引用ra,所以从汇编角度看,引用实际上是占用空间的,和指针没看出来区别。
从高级语言角度看,由于编译器的作用,对ra取地址,即&ra,获取的值并不是ebp-8,而是ebp-4,让我们感觉ra就是a的别名。
注:上面的测试代码及结果来自VS2005 Release禁用优化。