如果想深入学习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个字节。
其他
我们利用cl命令可以观察类的实际情况,比如我们定义了CEmpty空间,可以发现空类也是占用内存空间的,大小是一个字节,是编译器标志类的存在,当它有实际数据成员时,该标志就不存在了。
class CEmpty { };
空类的内存模型
我们利用cl命令和/d1reportSingleClassLayout选项可以完成更加复杂对象的内存分布情况,有助于理解c++其中的奥妙,本文仅仅是抛砖引玉,提供一个思路。