• 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++其中的奥妙,本文仅仅是抛砖引玉,提供一个思路。


  • 相关阅读:
    粘包现象
    SOCKET的简单介绍
    jQuery基本语法
    Bet(The 2016 ACM-ICPC Asia China-Final Contest 思路题)
    World Cup(The 2016 ACM-ICPC Asia China-Final Contest dfs搜索)
    Number Theory Problem(The 2016 ACM-ICPC Asia China-Final Contest 找规律)
    HDU
    Yin and Yang Stones(思路题)
    在线数学公式编译器
    HDU
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468397.html
Copyright © 2020-2023  润新知