Visual Studio 2008(VS2008)可以允许用户查看C++对象在内存中的布局。这个选项就是/d1 reportSingleClassLayout。
在写好相应的xxx.cpp文件之后,需要如下步骤:
(1) 启动VS2008的命令行工具“Visual Studio 2008 Command Prompt”,切换到cpp文件所在目录之后;
(2) 输入如下的命令:
cl [filename].cpp /d1reportSingleClassLayout[className]
这里的cl是MS的编译器;[filename].cpp就是你所想要查看的class所在的cpp文件
注意:class定义在头文件也没关系,只要编译cpp文件即可);而你需要在最后加上[className],也就是你需要查看的class的类名。
Steps as follow :
the source name is :test.cpp:
#include <iostream>
using namespace std;
class Base
{
public:
int a;
virtual void fcn() {};
};
class Derived : public Base
{
public:
virtual void fcn2() {};
private:
int d;
void fcn3() { }
};
int main(void)
{
}
那么就可以用下面的命令行。
cl Test.cpp /d1reportSingleClassLayoutDerived
结果显示如下:
可以看到class Derived的对象的内存布局,在派生类对象的开始包含了基类Base的对象,其中有一个虚表指针,指向的就是下面的Derived::$vftable@ (virtual function table),表中包含了Derived类中所有的虚函数。
【再举一例】
下面是一个经典的虚继承的菱形继承结构的代码:
#include <iostream>
using namespace std;
class Base
{
public:
int a;
virtual void fcn1() {};
};
class Derived1 : public Base
{
public:
int b;
virtual void fcn2() {};
};
class Derived2 : public Base
{
public:
int c;
virtual void fcn3() {};
};
class Child : virtual public Derived1, virtual public Derived2
{
public:
int d;
virtual void fcn4() {} ;
};
int main(void)
{
}
显示结果则如下:
其中{vbptr}表示虚继承的虚基类指针。然后这个Child类其实有三个虚函数表指针(图中的三个{vfptr}),下面则分别给出了虚基类指针和三个虚函数表指针的具体内容。其中的那些负数表示这些指针举例对象起始位置的offset。