现在的位置: 首页 > 综合 > 正文

VS2010命令行下查看虚函数表和类内存布局

2017年08月28日 ⁄ 综合 ⁄ 共 1946字 ⁄ 字号 评论关闭

VS2010命令行下查看虚函数表和类内存布局

——《深度探索C++对象模型》读书札记系列

 

在学习多重继承下的Virtual functions时,需要分析派生类的虚函数表(vtable),但是在网上找了好几种Hack vtable方法,结果都不尽如人意。没想到MS Compiler(以VS2010为例)有打印vtable的编译选项,真是太好了!

1. 打开“Visual Studio Command Prompt (2010)”,如下

该CMD下具有VS2010命令行下的一些编译、链接等工具,例如cl.exe。

 

2. 编写一个cpp文件

以《深度探索C++对象模型》的160页的代码(160.cpp)为例,如下

  1. class Base1 {  
  2. public:  
  3.     Base1();  
  4.     virtual ~Base1();  
  5.     virtual void speackClearly();  
  6.     virtual Base1* clone() const;  
  7. protected:  
  8.     float data_Base1;  
  9. };  
  10.   
  11. class Base2 {  
  12. public:  
  13.     Base2();  
  14.     virtual ~Base2();  
  15.     virtual void mumble();  
  16.     virtual Base2* clone() const;  
  17. protected:  
  18.     float data_Base2;  
  19. };  
  20.   
  21. class Derived : public Base1, public Base2 {  
  22. public:  
  23.     Derived();  
  24.     virtual ~Derived();  
  25.     virtual Derived* clone() const;  
  26. protected:  
  27.     float data_Derived;  
  28. };  
  29.   
  30. int main(void)  
  31. {  
  32.     return 0;  
  33. }  

 

3、使用cl命令的/d1 reportAllClassLayout或reportSingleClassLayoutXXX选项。这里的reportAllClassLayout选项会打印大量相关类的信息,一般用处不大。而reportSingleClassLayoutXXX选项的XXX代表要编译的代码中类的名字(这里XXX类),打印XXX类的内存布局和虚函数表(如果代码中没有对应的类,则选项无效)。

举例如下

  1. cl /d1 reportSingleClassLayoutBase1 160.cpp  

 

运行结果下

可以看出Base1的大小为8个字节,共有3个虚函数,分别是~Base1、speackClearly和clone,对于学习上述的示例代码绰绰有余咯~~

 

参考资料:

1、http://stackoverflow.com/questions/3062647/how-to-get-every-virtual-function-index-just-as-the-compiler-does

2、http://blog.csdn.net/lfhfut/article/details/4666142

3、http://blogs.msdn.com/b/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in-visual-c-and-fixing-lnk2022.aspx

 

 

 

抱歉!评论已关闭.