通过反汇编代码解读指针和引用的内在机理 .

试图用中文、英文等自然语言将 C++ 的指针和引用的异同描述得简练、通透是一件困难的事情,而阅读包含指针和引用的反汇编代码是一个好办法:这绝对是一种无二义性和尽可能简练的陈述。
    比如下述代码
void main(void)
{         
    int x1=0,*ptrx1=&x1;
    int x2=0,&refx2=x2;

    (*ptrx1)++;    //关注对变量的操作
    refx2++;

    printf("x1=%d,x2=%d/n",x1,x2);
}
执行后,通过指针及引用对变量的间接操作使 x1 和 x2 都增加了 1 ,不过究竟是如何实现的?我们一起分析反汇编代码:
    (*ptrx1)++;
mov edx,dword ptr [ebp-8]    ;先读取 x1 的指针到 edx
mov eax,dword ptr [edx]      ;然后读取 x1 的值到 eax
add eax,1                    ;在 eax 中将 x1 的值增 1
mov ecx,dword ptr [ebp-8]    ;再次读取 x1 的指针到 ecx
mov dword ptr [ecx],eax      ;将增 1 后的变量值送回
       refx2++;
mov edx,dword ptr [ebp-10h]
mov eax,dword ptr [edx]
add eax,1
mov ecx,dword ptr [ebp-10h]
mov dword ptr [ecx],eax
很显然,通过引用将被引用的变量增 1 和通过指针将其指向的变量增 1 的机器代码完全一致,这说明引用形式上以操作变量的简单形式、暗地里采用了和指针一样的方式:通过地址定位和操作变量。
    除了通过地址定位和操作变量外,引用不提供对地址的操作,缺乏指针访问变量的灵活性。引用的优势是简练,比较适合函数的参数传递,比如:
void chg(int* x,int& y)        //前一个参数是指针、后一个是引用
{
    x++;
    y++;
}

int main(void)
{         
    int mx=0,my=0;
    chg(&mx,my);
}

分析反汇编代码:
    chg(&mx,my);    //指针和引用都通过地址传递参数
lea eax,[ebp-8]
push eax
lea ecx,[ebp-4]
push ecx
call @ILT+0(chg) (00401005)
    x++;           // x++ 修改地址
mov eax,dword ptr [ebp+8]
add eax,4
mov dword ptr [ebp+8],eax
    y++;           // y++ 通过地址修改变量
mov ecx,dword ptr [ebp+0Ch]
mov edx,dword ptr [ecx]
add edx,1
mov eax,dword ptr [ebp+0Ch]
mov dword ptr [eax],edx
   显然:
① 指针和引用都通过地址定位和操作变量,这是共同点;
② 引用以操作普通变量的形式操作变量:简略;不具备操作变量地址的
功能 :不及指针灵活和强大——这是指针和引用的不同点。
    通过上述分析,不知道是否可以这样认为:引用以简略的方式取代了某些条件下指针的作用;引用涵盖了指针的部分功能;指针可以取代引用,而引用不能取代指针。
    上述“分析”过程其实应该叫做“解读”,因为反汇编代码已经对指针和引用的功能给出了绝对无二义性的、尽可能简练和人性化的描述,对知晓汇编语言的人而言应该是毫无障碍的——这就是我顺便想说的:汇编语言是研究高级语言的万能钥匙
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值