• (虚)继承类的内存占用大小


    ()继承类的内存占用大小 
    首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用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;
    }

     

  • 相关阅读:
    架构师如何才能够设计一个安全的架构
    Google Analytics实用用小技巧
    如何从Linux系统中删除用户账户
    使用C++编译器的编译流程
    JavaScript中双叹号的使用实例
    Android合并文件的三种方式代码
    自学Linux命令的四种方法
    前端工程师必备实用网站
    给 iOS App 开发者的 39 个开源的 Swift UI 库
    关于iOS项目的一本书
  • 原文地址:https://www.cnblogs.com/bewolf/p/4134265.html
Copyright © 2020-2023  润新知