VS使用命令行选项查看对象的内存布局

微软的Visual Studio 2008(VS2008)提供了一个新的选项,给用户显示C++对象在内存中的布局。

这个选项就是/d1reportSingleClassLayout。

具体使用方法如下,在写好相应的cpp文件之后,需要启动VS2008的命令行工具“Visual Studio 2008 Command Prompt”,(在工具下面:visual stdio命令提示)
切换到cpp文件所在目录之后(cd命令),输入如下的命令:

cl [filename].cpp /d1reportSingleClassLayout[className]

cl当然就是MS的编译器咯;[filename].cpp就是你所想要查看的class所在的cpp文件(class定义在头文件也没关系,还是只要编译cpp文件即可);而你需要在最后加上[className],也就是你需要查看的class的类名。

【举例】

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

{
}

我想查看Derived这个类的对象在内存中的布局,那么就可以用下面的命令行。

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。

=============================================

虚继承

1) 代码:

复制代码
Code
#include <iostream>
using namespace std;

class B
{
public:
    
int i;
    
virtual void vB(){ cout << "B::vB" << endl; }
    
void fB(){ cout << "B::fB" << endl;}
};

class D1 : virtual public B
{
public:
    
int x;
    
virtual void vD1(){ cout << "D1::vD1" << endl; }
    
void fD1(){ cout << "D1::fD1" << endl;}
};

class D2 : virtual public B
{
public:
    
int y;
    
void vB(){ cout << "D2::vB" << endl;}
    
virtual void vD2(){ cout << "D2::vD2" << endl;}
    
void fD2(){ cout << "D2::fD2" << endl;}
};

class GD :  public D1, public D2
{
public:
    
int a;
    
void vB(){ cout << "GD::vB" << endl;}
    
void vD1(){cout << "GD::vD1" << endl;}
    
virtual void vGD(){cout << "GD::vGD" << endl;}
    
void fGD(){cout << "GD::fGD" << endl;}
};
复制代码

 

 

2)类图:

 

3)VS2008的编译选项查看布局:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值