C++进一步认识
2007-01-13 13:45
281 查看
这两天深入学习了C++底层的实现.有一些感想
带有虚函数的类包含有一个虚函数表指针在其一个实例对象的开始部分.而每一个带虚函数的类都至少有一个虚函数表.对象的虚表指针就指向与之对应的类的虚表地址.对象调用相应虚函数是通过查找类的虚表来实现动太调用的.虚表指针的初始化是在构造完成之后进行.所以有基类的对象虚表指针会被赋两次值.在构造函数中调用虚函数是调用的基类的虚函数.直到派生类构造完成后再调用才是调用的派生类的相应函数,因为那时的虚表指针被重新赋值成派生类的虚表了.为了了解虚函数的动态绑定,使用了VS2005中的C++调试工具,反汇编,内存查看等.发现:C++函数都是采用的__stdcall方式调用函数的,即有关堆栈的恢复是在被调函数内完成.一般调用一个虚函数有如下几步:1 将参数压栈,对象指针进ECX,查找虚函数表,找到相应函数 2将当前地址压栈,即执行CALL操作 3 跳转到函数入口地址 4 保存当前栈顶指针 5 初始化函数栈空间.一般是在当前栈往上几十个字节(如果没有局部变量) 6 初始化局部变量空间.局部变量空间与函数栈空间相隔0XCC个字节 7保存ECX中的THIS指针到局部变量空间的第二个位置(第一个32位保留了,估计是为了与以后的64位兼容) 8执行函数.发现相邻局部变量之间都会空出来8个字节 9 执行堆栈恢复并返回.多重继承有多个虚函数表.
带有虚函数的类包含有一个虚函数表指针在其一个实例对象的开始部分.而每一个带虚函数的类都至少有一个虚函数表.对象的虚表指针就指向与之对应的类的虚表地址.对象调用相应虚函数是通过查找类的虚表来实现动太调用的.虚表指针的初始化是在构造完成之后进行.所以有基类的对象虚表指针会被赋两次值.在构造函数中调用虚函数是调用的基类的虚函数.直到派生类构造完成后再调用才是调用的派生类的相应函数,因为那时的虚表指针被重新赋值成派生类的虚表了.为了了解虚函数的动态绑定,使用了VS2005中的C++调试工具,反汇编,内存查看等.发现:C++函数都是采用的__stdcall方式调用函数的,即有关堆栈的恢复是在被调函数内完成.一般调用一个虚函数有如下几步:1 将参数压栈,对象指针进ECX,查找虚函数表,找到相应函数 2将当前地址压栈,即执行CALL操作 3 跳转到函数入口地址 4 保存当前栈顶指针 5 初始化函数栈空间.一般是在当前栈往上几十个字节(如果没有局部变量) 6 初始化局部变量空间.局部变量空间与函数栈空间相隔0XCC个字节 7保存ECX中的THIS指针到局部变量空间的第二个位置(第一个32位保留了,估计是为了与以后的64位兼容) 8执行函数.发现相邻局部变量之间都会空出来8个字节 9 执行堆栈恢复并返回.多重继承有多个虚函数表.
相关文章推荐
- c++中函数参数传递(值传递、指针传递,引用传递)进一步认识
- c++中函数参数传递(值传递、指针传递,引用传递)进一步认识
- c++中函数参数传递(值传递、指针传递,引用传递)进一步认识
- C++第九章 类和对象的进一步认识(一)
- 第二个C++程序(对C++的进一步认识)
- c++中函数参数传递(值传递、指针传递,引用传递)进一步认识
- c++ 关于引用 &的进一步理解
- C++指针和数组:认识指针和数组
- C++之父谈关于C++的五个需要被重新认识的观点
- COUNT()的进一步认识
- 对C和C++的一点儿认识
- 对C++中指针初始化的一些认识
- 有关C++中的常对象,常成员函数,常数据成员,常引用的认识
- 对C++中的外部变量和外部函数的认识
- 写模板string类, 认识STL的模块分离策略----小话c++(7)
- 对C++中异常处理的语法的认识
- 聊聊我对c/c++的认识
- OpenCv-python之进一步认识像素
- 进一步理解C++构造与析构
- 对c++模版的认识 template关键字