从汇编角度理解C++虚函数调用机制
2014-10-15 13:54
218 查看
#include <memory> class Base { public: virtual void print(){ printf("Base::print()\n");} void print2(){} public: int m_id; }; class Imp : public Base { private: void print(){ printf("Imp::print()\n");} }; template<class T> void swap(T& a, T& b) { T tmp; tmp = a; a = b; b = tmp; } int main() { int a = 1, b = 2; swap(a, b); Base* pBase = new Base(); Base* pImp = new Imp(); __asm // pImp->print()汇编实现(去除那些Debug调试信息) { mov eax,dword ptr [pImp] //获取pImp这个指针数据值,可以理解pImp是个整形变量,取整形变量内的值即指针 mov edx,dword ptr [eax] //获取pImp第一个数据地址,即虚函数表地址 mov eax,dword ptr [edx] //获取虚函数表指针指向的第一个函数指针 call eax //调用Imp::print() } pBase->print(); pBase->m_id = 5; getchar(); return 0; }
上面插入的一段汇编就是虚函数调用,可以vs IDE下通过反汇编Alt+8,查看。
1、只要这个类中有虚函数,则此类就有属于自己的虚函数表指针;
2、虚函数表指针隐藏在类的内存数据的最前面4个字节(32位程序,指针长度);
3、虚函数每次调用都需要通过虚函数表指针锁定到指定地址才可以调用。
相关文章推荐
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- 从底层汇编理解 c++ 引用实现机制 (转+增加)
- 从汇编角度来理解linux下多层函数调用堆栈运行状态
- C++继承类和基类之间成员函数和虚函数调用机制
- 从汇编和高级语言的角度理解传值方式,传值,传引用,传指针的本质机制与区别。白话通俗易懂。
- 从底层汇编理解 c++ 引用实现机制 (转+增加)
- ZT从底层汇编理解 c++ 引用实现机制
- C++虚函数调用的反汇编解析
- C++继承类和基类之间成员函数和虚函数调用机制
- C++重写(override)、重载(overload)、重定义(redefine)以及虚函数调用机制【个人总结】
- C++编译期间的虚函数调用机制
- C++继承类和基类之间成员函数和虚函数调用机制
- C++中理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异(11)---《More Effective C++》
- 从汇编角度来理解linux下多层函数调用堆栈运行状态
- 有图有真相带你理解C++中虚函数调用机制
- 从底层汇编理解 c++ 引用实现机制
- 关于C++虚函数与普通函数的编译与调用机制
- C++编译期间的虚函数调用机制 .
- 从汇编角度来理解linux下多层函数调用堆栈执行状态