zoukankan      html  css  js  c++  java
  • (虚)继承类的内存占用大小

    ()继承类的内存占用大小 
    首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。 
    计算一个类对象的大小时的规律: 
        1、空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同); 
        2、一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的; 
        3、因此一个对象的大小≥所有非静态成员大小的总和; 
        4、当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable; 
        5、虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数); 
        6、在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐; 
        7、类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。

    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    
    class A
    {
        
    };
    class B
    {
    public:
        virtual void b1(){}
        virtual void b2(){}
    };
    class C : public B
    {
    public:
        virtual void c(){}
    };
    class D : public virtual B
    {
    public:
        virtual void d1(){}
        virtual void d2(){}
    };
    class E : public virtual D
    {
    public:
        virtual void e1(){}
        virtual void e2(){}
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
        cout<<sizeof(A)<<endl<<sizeof(B)<<endl<<sizeof(C)<<endl<<sizeof(D)<<endl<<sizeof(E);
        return 0;
    }

     

  • 相关阅读:
    session和cookie
    数据库备份
    使用pip安装.whl文件时出现is not a supported wheel on this platform的解决办法
    multiprocessing模块
    threading模块
    python中多线程相关
    python中实现单例模式
    Flask-SQLAlchemy相关与Flask-Migrate相关
    redis模块
    Flask-Login中装饰器@login_manager.user_loader的作用及原理
  • 原文地址:https://www.cnblogs.com/bewolf/p/4134265.html
Copyright © 2011-2022 走看看