c++类大小问题

1.空类函数

class A
{
};

sizeof(A); //1

解析:类的实例化就是为每一个实例在内存中分配一块地址;每一个类在内存中都有惟一的标识,所以空类被实例化时,编译器会隐含地为其添加一个字节,以做区分。spa

2.虚函数类指针

class A
{
    virtual void Fun();
};

sizeof(A); //4

解析:当一个类中包含虚函数时,会有一个指向其虚函数表的指针vptr,系统为类指针分配大小为4个字节(即便有多个虚函数)。code

3.普通数据成员blog

class A
{
    int a;
    char b;
};

sizeof(A); //8

解析:普通数据成员,按照其数据类型分配大小,因为字节对齐,因此a+b=8字节。继承

4.静态数据成员内存

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

sizeof(A); //4

解析:静态数据成员存放的是全局数据段,即便它是类的一个成员,但不影响类的大小;无论类产生多少实例或者派生多少子类,静态成员数据在类中永远只有一个实体存在。而类的非静态数据成员只有被实例化时,才存在,但类的静态数据成员一旦被声明,不管类是否被实例化,它都已存在,类的静态数据成员能够说是一种特殊的全局变量。编译器

5.普通成员函数编译

class A
{
    void Fun();
};

sizeof(A); //1

解析:类的大小与它的构造函数、析构函数以及其余成员函数无关,只与它的数据成员相关。class

6.普通继承

class A
{
    int a;
};

class B:public A
{
    int b;
};

sizeof(B); //8

解析:普通类的继承,类的大小为自己数据成员大小+基类数据成员大小。

7.虚函数继承

virtual class A
{
    int a;
};

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

sizeof(B); //12

解析:虚函数类的继承,派生类大小=派生类自身成员大小+基类数据成员大小+虚拟指针大小(即便继承多个虚基类,也只有一个指向其虚函数表的指针vptr,大小为4字节)。

相关文章
相关标签/搜索