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)为例,如下
- class Base1 {
- public:
- Base1();
- virtual ~Base1();
- virtual void speackClearly();
- virtual Base1* clone() const;
- protected:
- float data_Base1;
- };
- class Base2 {
- public:
- Base2();
- virtual ~Base2();
- virtual void mumble();
- virtual Base2* clone() const;
- protected:
- float data_Base2;
- };
- class Derived : public Base1, public Base2 {
- public:
- Derived();
- virtual ~Derived();
- virtual Derived* clone() const;
- protected:
- float data_Derived;
- };
- int main(void)
- {
- return 0;
- }
class Base1 {
public:
Base1();
virtual ~Base1();
virtual void speackClearly();
virtual Base1* clone() const;
protected:
float data_Base1;
};
class Base2 {
public:
Base2();
virtual ~Base2();
virtual void mumble();
virtual Base2* clone() const;
protected:
float data_Base2;
};
class Derived : public Base1, public Base2 {
public:
Derived();
virtual ~Derived();
virtual Derived* clone() const;
protected:
float data_Derived;
};
int main(void)
{
return 0;
}
3、使用cl命令的/d1 reportAllClassLayout或reportSingleClassLayoutXXX选项。这里的reportAllClassLayout选项会打印大量相关类的信息,一般用处不大。而reportSingleClassLayoutXXX选项的XXX代表要编译的代码中类的名字(这里XXX类),打印XXX类的内存布局和虚函数表(如果代码中没有对应的类,则选项无效)。
举例如下
- cl /d1 reportSingleClassLayoutBase1 160.cpp
cl /d1 reportSingleClassLayoutBase1 160.cpp
运行结果下
可以看出Base1的大小为8个字节,共有3个虚函数,分别是~Base1、speackClearly和clone,对于学习上述的示例代码绰绰有余咯~~
参考资料:
2、http://blog.csdn.net/lfhfut/article/details/4666142