天天看點

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.彈出視窗

c++對象記憶體模型分析工具

      我的編譯器安裝在D盤:

切換路徑

c++對象記憶體模型分析工具

輸入指令

我們利用vs2008下的cl指令,/d1reportSingleClassLayout 選項完成c++對象記憶體分布情況,清晰明了,我們需要指定檔案名和類名,具體格式如下:

cl [filename].cpp /d1reportSingleClassLayout[className]
           

        基類CAnimal的記憶體分布:

c++對象記憶體模型分析工具
從中可以看出,基類CAnimal占用了4個位元組的空間,是指向虛函數表的指針,其中虛函數表中有run(),和eat()兩個方法。
子類Horse記憶體分布
c++對象記憶體模型分析工具

       CHorse繼承于基類CAnimal,和基類不同之處就是:在子類CHorse中增加了usLegNum的資料成員,子類大小占8個位元組。

其他

我們利用cl指令可以觀察類的實際情況,比如我們定義了CEmpty空間,可以發現空類也是占用記憶體空間的,大小是一個位元組,是編譯器标志類的存在,當它有實際資料成員時,該标志就不存在了。

class CEmpty
{

};
           
空類的記憶體模型
c++對象記憶體模型分析工具

        我們利用cl指令和/d1reportSingleClassLayout選項可以完成更加複雜對象的記憶體分布情況,有助于了解c++其中的奧妙,本文僅僅是抛磚引玉,提供一個思路。