如果想深入学习c++,一定会接触c++对象内存模型分析,vs编译器自身提供了一个内存模型分析工具,使用方便,类内存可视化,是我们学习c++的重要工具。下面将直接展示如何使用该工具,环境配置:win7 32位+vs2008。
建立工程
创建工程很简单,这里不再赘述,在该工程下有CppTest.cpp文件,其中内容如下:
//基类
class CAnimal
{
public:
//虚函数run
virtual void run()
{
cout << "run with leg" <<endl;
}
//虚函数eat
virtual void eat()
{
cout << "eat food" <<endl;
}
};
//子类
class CHorse:public CAnimal
{
public:
//子类重写run
virtual void run()
{
cout << "run with 4 legs" <<endl;
}
//子类重写eat
virtual void eat()
{
cout << "eat grass" <<endl;
}
private:
unsigned usLegNum;
};
打开命令提示符
1.点击Visual Stdio 2008 Command Prompt,具体位置:Tool->Visual Stdio 2008 Command Prompt.
2.弹出窗口
我的编译器安装在D盘:
切换路径
输入命令
我们利用vs2008下的cl命令,/d1reportSingleClassLayout 选项完成c++对象内存分布情况,清晰明了,我们需要指定文件名和类名,具体格式如下:
cl [filename].cpp /d1reportSingleClassLayout[className]
基类CAnimal的内存分布:
从中可以看出,基类CAnimal占用了4个字节的空间,是指向虚函数表的指针,其中虚函数表中有run(),和eat()两个方法。
子类Horse内存分布
CHorse继承于基类CAnimal,和基类不同之处就是:在子类CHorse中增加了usLegNum的数据成员,子类大小占8个字节。
其他
class CEmpty
{
};
空类的内存模型
我们利用cl命令和/d1reportSingleClassLayout选项可以完成更加复杂对象的内存分布情况,有助于理解c++其中的奥妙,本文仅仅是抛砖引玉,提供一个思路。