• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[C++]VS2008使用命令行选项查看对象的内存布局

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

这个选项就是/d1reportSingleClassLayout。

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

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。

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

最后加一句,我并不支持这种非要深入研究对象内存布局的行为,再说这种布局完全是由编译器决定的,GCC的内存布局很可能就完全不同。这个对提高C++水平并没有多大的益处。点到为止。







鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++写时钟表发布时间:2022-07-14
下一篇:
linux学习笔记之系统标准:POSIX,ISOC...发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap