• C++中一个class类对象占用多少内字节(7个例子,很清楚)


    一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?

    一个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。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。

    http://blog.163.com/wangsh_ll/blog/static/193496173201421344429845/

  • 相关阅读:
    Python中的类(上)
    Django REST Framework API Guide 07
    Django REST Framework API Guide 06
    Django REST Framework API Guide 05
    Django REST Framework API Guide 04
    Django REST Framework API Guide 03
    Django REST Framework API Guide 02
    Django REST Framework API Guide 01
    Django 详解 信号Signal
    Django 详解 中间件Middleware
  • 原文地址:https://www.cnblogs.com/findumars/p/7270628.html
Copyright © 2020-2023  润新知