dufaxing To be a better man

class的大小

2020-04-16
C++


KYHHbj.png

博客地址

空类

class A
{
};

sizeof(A); //1
  • 类的实例化就是为每个实例在内存中分配一块地址;每个类在内存中都有唯一的标识,因此空类被实例化时,编译器会隐含地为其添加一个字节,以作区分。

虚函数类

class A
{
    virtual void Fun();
};

sizeof(A); //4
class A
{
    virtual void Fun();
    virtual void Fun1();
};

sizeof(A); //4
  • 当一个类中包含虚函数时,会有一个指向其虚函数表的指针vptr,系统(32位)为类指针分配大小为4个字节(即使有多个虚函数)。

普通数据成员

class A
{
    int a;
    char b;
};

sizeof(A); //8
  • 普通数据成员,按照其数据类型分配大小,由于字节对齐,所以a+b=8字节。

静态数据成员

class A
{
    int a;
    static int b;
};

sizeof(A); //4
  • 静态数据成员存放的是全局数据段,即使它是类的一个成员,但不影响类的大小;不管类产生多少实例或者派生多少子类,静态成员数据在类中永远只有一个实体存在。而类的非静态数据成员只有被实例化时,才存在,但类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在,类的静态数据成员可以说是一种特殊的全局变量。

普通成员函数

class A
{
    void Fun();
};

sizeof(A); //1
  • 类的大小与它的构造函数、析构函数以及其他成员函数无关,只与它的数据成员相关。

普通继承

class A
{
    int a;
};

class B:public A
{
    int b;
};

sizeof(B); //8
  • 普通类的继承,类的大小为本身数据成员大小+基类数据成员大小。

虚继承

virtual class A
{
    int a;
};

class B:virtual public A
{
    int b;
};

sizeof(B); //12
  • 虚继承,派生类大小=派生类自身成员大小+基类数据成员大小+虚拟指针大小(即使继承多个虚基类,也只有一个指向其虚函数表的指针vptr,大小为4字节)。


Similar Posts

上一篇 动态规划算法

Comments