int& b=a;
lea eax,[a];
mov dword ptr[b],eax;把a的地址赋给地址为b的一块内存
b=50;
mov eax,dword ptr[b];
mov dword ptr[eax],32h;
int *d=&a;
lea eax,[a];
mov dword ptr[d],eax
*d=60;
mov eax,dword ptr[d]
mov dword ptr[eax],3ch;
以上的代码均来自具体的编译器,怎么样,相信了吧,好,让我再来做一个或许不怎么恰当的比拟,你一定编过有关线性表和栈的程序吧,线性表是一个非常灵活的数据结构,在他上面有许多的操作,然而栈呢,它是一个限制性操作的线性表,它的底层操作实际上是由线性表操作实现的。就好比stack与vector的关系,因此指针和引用的关系就好比线性表和栈的关系,引用也就是受限的指针,它对外的接口和指针虽然并不一样,但底层是相同的。
下面再来看看引用的一个重要用途,作为函数的参数传递的时候是怎样的情形:
void swapr(int &a, int &b);
void swapr(int* a, int *b);
int a=10;
int b=20;
swapr(a, b);
lea eax,[a];
push eax; //把a的地址压入堆栈
lea ecx,[b];
push ecx;
call swapr;
swapr(&a, &b);
lea eax,[a];
push eax;
lea ecx,[b];
push ecx;
call swapr;
怎么样,用引用和指针传递参数无论是在效率上还是在空间上都是完全一样的,如果妄想不传入地址就修改实参的值,简直就是天方夜谭,这就说明引用的本质就是指针。毕竟它们的行为都太相似了,如果不是这样,你还有什么方法去实现引用吗?记住,引用只不过是编译器为你提供的一个有用且安全的工具,对于机器代码可无法表示它,它把指针一对多的缺点去除,禁止了你的不安全的操作。但回到问题的本源,他们没有任何区别。
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 机制 底层 一个 编译 引用 指针 代码 eax 地址 我们 int |
注册
个人空间
