• C++类占用内存大小探究


    先看一个例子
    #include<iostream>
    using namespace std;
    class a {};
    class b{};
    class e{
    public:
    void func1();
    virtual void func2();
    private:
    static int n;
    int m;
    };
    class c:public a{
    virtual void fun()=0;
    };
    class d:public b,public c{};
    int main(){
    cout<<"sizeof(a)"<<sizeof(a)<<endl;
    cout<<"sizeof(b)"<<sizeof(b)<<endl;
    cout<<"sizeof(c)"<<sizeof(c)<<endl;
    cout<<"sizeof(d)"<<sizeof(d)<<endl;
    cout<<"sizeof(e)"<<sizeof(e)<<endl;
    return 0;
    }
    输出结果:




    为什么会出现这种结果呢?首先要出需要多少内存表现一个类说起:一般而言有以下三种

    1、非静态数据成员的总和大小;

    2、为了支持virtual而由内部产生的额外负担,一般类内部产生指向虚函数的指针,32位的计算机每个指针占4个字节;

    3、加上任何由于译注的需求而填补上去的空间;

    类a,b明明是空类,它的大小应该为为0,为什么 编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以a,b的大小为1.

    而类c是由类a派生而来,它里面有一个纯虚函数,由于有虚函数的原因,有一个指向虚函数的指针(vptr),在32位的系统分配给指针的大小为4个字节,所以最后得到c类的大小为4.

    类d的大小更让初学者疑惑吧,类d是由类b,c派生迩来的,它的大小应该为二者之和5,为什么却是8  呢?这是因为为了提高实例在内存中的存取效率.类的大小往往被调整到系统的整数倍.并采取就近的法则,里哪个最近的倍数,就是该类的大小,所以类d的大小为8个字节.

    当然在不同的编译器上得到的结果可能不同,但是这个实验告诉我们初学者,不管类是否为空类,均可被实例化(空类也可被实例化),每个被实例都有一个独一无二的地址.

  • 相关阅读:
    BERT基础知识
    TorchText使用教程
    Pytorch-中文文本分类
    预处理算法_5_数据集划分
    预处理算法_4_表堆叠
    预处理算法_3_新增序列
    预处理算法_2_类型转换
    预处理算法_1_表连接
    爬取网站所有目录文件
    如何将Docker升级到最新版本
  • 原文地址:https://www.cnblogs.com/ZhenXin0101/p/11451572.html
Copyright © 2020-2023  润新知