C++进一步认识

时间:2022-04-22 09:40:33

这两天深入学习了C++底层的实现.有一些感想

带有虚函数的类包含有一个虚函数表指针在其一个实例对象的开始部分.而每一个带虚函数的类都至少有一个虚函数表.对象的虚表指针就指向与之对应的类的虚表地址.对象调用相应虚函数是通过查找类的虚表来实现动太调用的.虚表指针的初始化是在构造完成之后进行.所以有基类的对象虚表指针会被赋两次值.在构造函数中调用虚函数是调用的基类的虚函数.直到派生类构造完成后再调用才是调用的派生类的相应函数,因为那时的虚表指针被重新赋值成派生类的虚表了.为了了解虚函数的动态绑定,使用了VS2005中的C++调试工具,反汇编,内存查看等.发现:C++函数都是采用的__stdcall方式调用函数的,即有关堆栈的恢复是在被调函数内完成.一般调用一个虚函数有如下几步:1 将参数压栈,对象指针进ECX,查找虚函数表,找到相应函数 2将当前地址压栈,即执行CALL操作 3 跳转到函数入口地址 4 保存当前栈顶指针 5 初始化函数栈空间.一般是在当前栈往上几十个字节(如果没有局部变量) 6 初始化局部变量空间.局部变量空间与函数栈空间相隔0XCC个字节 7保存ECX中的THIS指针到局部变量空间的第二个位置(第一个32位保留了,估计是为了与以后的64位兼容) 8执行函数.发现相邻局部变量之间都会空出来8个字节 9 执行堆栈恢复并返回.多重继承有多个虚函数表.