C++类的大小

 类的大小的计算原则:

1、类大小的计算遵循结构体的对齐原则;
2、类的大小与普通数据成员有关,与虚函数有关,与成员函数和静态成员无关;
3、虚函数对类的大小有影响,是因为虚函数表指针带来的影响(在32位系统里,虚函数的指针为4字节;在64位系统里,虚函数指针为8字节);
4、虚继承对类的大小有影响,是因为虚基表指针带来的影响
5、空类的大小是一个特殊情况,空类的大小为1(实际是和编译器有关的,VS规定为1)。

例子:

64位的操作系统--->虚函数指针为8字节;

char占1字节;int占4字节

#include<iostream>
using namespace std;


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="<<sizeof(A)<<endl;    //result=1  
    cout<<"B="<<sizeof(B)<<endl;    //result=16      
    cout<<"C="<<sizeof(C)<<endl;    //result=16  
    cout<<"D="<<sizeof(D)<<endl;    //result=16  
    cout<<"E="<<sizeof(E)<<endl;    //result=32  
    return 0;  
}  

结果分析:
1、A为空类,所以大小为1;

2、B的大小为char数据成员大小+vptr指针大小。由于字节对齐,大小为8+8=16;

3、C的大小为两个char数据成员大小+vptr指针大小。实际的存储情况为,两个char类型占2字节,因为后面存储的是虚函数指针,需要8字节,所以由于字节对齐,两个char也占8字节,因此大小为8+8=16;

4、D为多继承派生类,由于D有数据成员,所以继承空类A时,空类A的大小1字节并没有计入当中,D继承C,此情况D只需要一个vptr指针(因为一个基类是空类,相当于只继承了一个基类,所以只需要指向虚类的虚指针)。D类大小为数据成员加一个指针大小,实际存储情况是:

① 指向C类虚函数表的虚指针  8字节;

② C类成员数据:两个char  2字节 --->4字节;

③ D类成员数据:一个int     4字节,因为字节对齐,所以上面的两个char也为4字节;

所以D类的大小为8+8 = 16字节。

 5、E为多继承派生类,此情况为我们上面所讲的多重继承,含虚函数覆盖的情况。此时大小计算为数据成员的大小+2个基类虚函数表指针大小,考虑字节对齐,结果为8+8+2*8=32。实际内存分布情况为:

① 指向B类虚函数表的虚指针     8字节

② B类的数据成员: 一个char     1字节 ----> 8字节

③ 指向C类虚函数表的虚指针      8字节;上面的B类的数据成员函数需要字节对齐,所以上面的②中的一个char也是8字节;

④ C类的数据成员:两个char      2字节 ----> 4字节

⑤ E类的数据成员:1个int        4字节;上面的C类的数据成员两个char需要与这一个int字节对齐,所以上面的④中的两个char也是4字节;

所以,E类的大小为8+8+8+4+4 = 32字节


 


是在原文的基础上加上了一些自己的理解^.^

原文链接:https://blog.csdn.net/fengxinlinux/article/details/72836199

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值