用内联汇编调虚函数, 理解VTABLE原理
虚函数和动态绑定是C++面向对象编程的核心内容之一。要理解C++虚函数的调用本质,就不得不说VPTR和VTABLE。所有拥有虚函数的C++类的大小都比可看到的内容多至少4个字节(如果派生树中存在多继承,就可能多于4个字节),这多出来的4个字节就是VPTR,它位于每个实例的最前方。VPTR的内容就是一个unsigned int的地址,指向一个内存区域,而这个被指向的内存区域就是VTABLE,所谓虚函数地址表。每个拥有虚函数的类都拥有一张VTABLE,里面是一个函数指针数组,每4个字节为一个单位,指向虚函数的入口地址。C++在调用虚函数时,首先要通过这个类的实例内容看到VPTR,从而找到VTABLE,然后根据要调用的虚函数,取相应偏移地址的内容,从而把调用转到这个位置。
以下是我用VC内联汇编编写的一个手工模拟此过程的示例,通过例子中的代码可以清楚的看出虚函数的调用过程。首先定义一个类,它有一个虚函数:
posted on 2006-11-19 04:13
Jerry Cat 阅读(2823)
评论(4) 编辑 收藏 引用