当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

C++对象筹划及多态实现之成员函数的调用[VC/C++编程]

赞助商链接



  本文“C++对象筹划及多态实现之成员函数的调用[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

从这部份开始我们除了操纵内存的信息打印来举行摸索外,更多的会通过跟踪和察看编译器产生的汇编代码来理解编译器对这些语言特点的实现方法.汇编方面知识的谈论超越了本文的范围,我只对和我们谈论相关的汇编代码举行解析.理解本文要谈论的知识并不需求有很完好的汇编知识,但必须理解最少的概念.

下面我们看看引入虚担当后的影响.为了有所比较我们首先看看普通成员函数的调用情形.

履行以下代码,它包含了对象的普通成员函数调用,类的静态成员函数调用、通过指针调用普通成员函数:

C010 obj;
PRINT_OBJ_ADR(obj)
obj.foo();
C012::sfoo();
C010 * pt = &obj;
pt->foo();

后果以下:

obj's address is : 0012F843

这是obj对象的内存地址.

首先我们看看对象的普通成员函数调用,obj.foo();,对应的汇编代码为:

00422E09 lea ecx,[ebp+FFFFF967h]

00422E0F call 0041E289

第1行把对象的地址存入ecx存放器,履行完这行指令后,我们要以看到ecx中的值为0x0012F843,就是前面打印出的值.假如函数需求传送参数,我们还会在前面看到一些push指令.在第2行我们可以看到call的是一个直接的地址,这也就是静态绑定.即函数的调用地址在编译时已经被编译器抉择.

跟踪进去我们要以看到是一条跳转指令,持续履行可以看到真正的函数代码部份,以下(注:为了谈论便利我在第行前面加了一个行号):

01 00425FE0 push ebp
02 00425FE1 mov ebp,esp
03 00425FE3 sub esp,0CCh
04 00425FE9 push ebx
05 00425FEA push esi
06 00425FEB push edi
07 00425FEC push ecx
08 00425FED lea edi,[ebp+FFFFFF34h]
09 00425FF3 mov ecx,33h
10 00425FF8 mov eax,0CCCCCCCCh
11 00425FFD rep stos dword ptr [edi]
12 00425FFF pop ecx
13 00426000 mov dword ptr [ebp-8],ecx
14 00426003 mov eax,dword ptr [ebp-8]
15 00426006 mov byte ptr [eax],2
16 00426009 pop edi
17 0042600A pop esi
18 0042600B pop ebx
19 0042600C mov esp,ebp
20 0042600E pop ebp
21 0042600F ret

我们看看第7行,把ecx存放器入栈,背面4行初始化了函数的仓库中的保存部分变量的部份.第12行弹出ecx值,到这里时ecx的值保持为在函数调用前存入的对象内存地址,第13行就是保存this指针的值,作为一个部分变量.这样我们就知道了VC7.1不是象传送普通函数那样通过压栈来传送this 指针,而是通过ecx存放器来传送.第14、15行操纵这个this指针给对象的成员变量举行了赋值.

再看看静态成员函数调用的汇编代码:

00422E14 call 0041DD84

非常直接,因为它不需求处理this指针,跟踪到函数的汇编代码,可以看到一样不需求处理this指针.具体的代码这里就不列出来了.

再看看通过指针调用普通成员函数pt->foo();,产生的汇编代码以下:

00422E25 mov ecx,dword ptr [ebp+FFFFF958h]

00422E2B call 0041E289

和通过对象调用普通成员函数的代码差不多.不过存对象地址到ecx存放器地,是通过解引用pt指针来找到对象地址的.


  以上是“C++对象筹划及多态实现之成员函数的调用[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: 与您的QQ/BBS好友分享!
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .