C++中虚函数继承类的内存占用大小计算

前半部分转自https://www.cnblogs.com/SeekHit/p/7570247.html

其中为32位字节对齐,后半部分给出自己的理解。

字节对齐的原理见链接https://www.cnblogs.com/0201zcr/p/4789332.html(注意64位系统虚函数指针占8字节,32位占4字节)

计算一个类对象的大小时的规律:

  • 1、空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
  • 2、一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;
  • 3、因此一个对象的大小≥所有非静态成员大小的总和;
  • 4、当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;
  • 5、虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者总共所占的空间大小为:8(或8乘以多继承时父类的个数);理解为虚函数表和虚基表分别占4字节。即基类的虚函数表总共占4个字节,子类的虚基表每个基类地址占4个字节
  • 6、在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;
  • 7、类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。
  • 例子一

    class A     
    {     
    };    
      
    class B     
    {  
        char ch;     
        virtual void func0()  {  }   
    };   
      
    class C    
    {  
        char ch1;  
        char ch2;  
        virtual void func()  {  }    
        virtual void func1()  {  }   
    };  
      
    class D: public A, public C  
    {     
        int d;     
        virtual void func()  {  }   
        virtual void func1()  {  }  
    };     
      
    class E: public B, public C  
    {     
        int e;     
        virtual void func0()  {  }   
        virtual void func1()  {  }  
    };  
      
    int main(void)  
    {  
        cout<<"A="<

你可能感兴趣的:(C++,虚函数)