zoukankan      html  css  js  c++  java
  • C++中一个类(非继承类)对象,所占内存空间大小

    离职后在家里带了半年多了,这半年多里没有编写过一行代码,倒是看过一些书,但是差不多也都是囫圃吞枣。房子也快要装修,也得赶快找一个工作了,不然养车,还要玩摄影,没收入的日子真是不好过啊。呵呵。

    按惯例,翻出一些经典书籍,先复习一下吧。借复习的过程,也记录也些东西,说是读书笔记也好,说是心得体会也行,总而言之写出来的目的主要是督促自我,认真的复习;次要的目的是便于一些朋友,在网络中搜索学习。其实吧,这样的基础知识,网络上到处都是,但我还是希望我总结出来的能有一些特点。

     

    闲话不多说了,言归正传。很多C++书籍中都介绍过,一个Class对象需要占用多大的内存空间。最权威的结论是:

    *非静态成员变量总合。

    *加上编译器为了CPU计算,作出的数据对齐处理。

    *加上为了支持虚函数,产生的额外负担。

     

    介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论)

    一、空类的Size

    class Car

    {

    };

     

    void main()

    {

           int size = 0;

           Car objCar;

           size = sizeof(objCar);

           printf("%s %d /r", "Class Car Size:", size);

    }

     

    输出结果:Class Car Size:1

     

    这是为何呢?我想对于这个问题,不仅是刚入行不久的开发新手,就算有过几年以上C++开发经验的开发人员也未必能说清楚这个。

    编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。

     

     

    二、只有成员变量的Size

    class Car

    {

    private:

           int nLength;

           int nWidth;

    };

     

    void main()

    {

           int size = 0;

           Car objCar;

           size = sizeof(objCar);

           printf("%s %d /r", "Class Car Size:", size);

    }

     

    输出结果:Class Car Size:8

    这个结果很多开发人员都清楚。在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。

     

    class Car

    {

    private:

           int nLength;

           int nWidth;

           static int sHigh;

    };

     

    void main()

    {

           int size = 0;

           Car objCar;

           size = sizeof(objCar);

           printf("%s %d /r", "Class Car Size:", size);

    }

    输出结果:Class Car Size:8

    我们这次在Class Car中添加了一个静态成员变量,但是Class Size仍然是8个字节。这正好符合了,结论中的第一条:非静态成员变量总合。

     

    class Car

    {

    private:

           char chLogo

           int nLength;

           int nWidth;

           static int sHigh;

    };

     

    void main()

    {

           int size = 0;

           Car objCar;

           size = sizeof(objCar);

           printf("%s %d /r", "Class Car Size:", size);

    }

    输出结果:Class Car Size:12

    在类中又插入了一个字符型变量,结果Class Size变成了12。这个就是编译器额外添加3个字符变量,做数据对齐处理,为了是提高CPU的计算速度。编译器额外添加的东西我们是无法看见的。这也符合了结论中的第二条:加上编译器为了CPU计算,作出的数据对齐处理。

    既然,我们这样定义类成员数据编译器会额外的增加空。那么,我们何不在定义类的时候就考虑到数据对齐的问题,可以多定义出3个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。

     

    三、只有成员函数的Size

    class Car

    {

    public:

           Car(){};

           ~Car(){};

    public:

           void Fun(){};

    };

     

    void main()

    {

           int size = 0;

           Car objCar;

           size = sizeof(objCar);

           printf("%s %d /r", "Class Car Size:", size);

    }

    输出结果:Class Car Size:1

    噢,这是怎么回事儿呢?再做一个实验看看。

    class Car

    {

    public:

           Car(){};

           ~Car(){};

    public:

           void Fun(){};

    private:

           int nLength;

           int nWidth;

    };

     

    void main()

    {

           int size = 0;

           Car objCar;

           size = sizeof(objCar);

           printf("%s %d /r", "Class Car Size:", size);

    }

    输出结果:Class Car Size:8

    这次应该很清楚的了。函数是不占用类空间的。第一个例子中的Size为1个字节,正是编译器为类创建一个隐含的一个字节的空间

     

    class Car

    {

    public:

           Car(){};

           virtual ~Car(){};

    public:

           void Fun(){};

    };

     

    void main()

    {

           int size = 0;

           Car objCar;

           size = sizeof(objCar);

           printf("%s %d /r", "Class Car Size:", size);

    }

    输出结果:Class Car Size:4

    这次,让析构函数为虚函数,看到了Class Size为4。这正是指向Virtual Table的指针vptr的Size。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。

     

    到此为止,一个Class Object究竟占用多少内存空间,已经完全说清楚了。但是,这只是针对单独类,或者说是基类适用。对于子类,却不一样了。有兴趣的朋友可以做一些实验。

  • 相关阅读:
    SRM 441(1-250pt, 1-500pt)
    SRM 387(1-250pt)
    SRM 388(1-250pt)
    SRM 389(1-250pt)
    SRM 601(1-250pt,500pt)
    SRM 409(1-250pt, 1-500pt)
    SRM 408(1-250pt, 1-500pt)
    unique() 去重函数
    poj3468(A Simple Problem with Integers)
    HDU1394(Minimum Inversion Number)
  • 原文地址:https://www.cnblogs.com/oneway1990/p/9125604.html
Copyright © 2011-2022 走看看