从汇编来看指针和引用的差别

引用是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

通过代码,我们也没有发现明显的差别。结论:在汇编代码中不存在引用的概念。那到底引用和指针的差别在哪里呢?取决于编译器对两者的不同处理,比如可以有两级指针,但是没有两级引用;可以有空指针,但是引用使用前必须初始化等等。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值