当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

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的是一个直接的地址,这也就是静态绑定。即函数的调用地址在编译时已经被编译器决议。

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接