c++对象内存模型分析工具

如果想深入学习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++其中的奥妙,本文仅仅是抛砖引玉,提供一个思路。


原文地址:https://www.cnblogs.com/jinxiang1224/p/8468397.html