【1】类的大小只与下列因素相关:
- 类中非静态的成员变量
- 涉及子父类虚继承时,存在vbptr指针(若多继承,可能不止一个)
- 涉及虚函数时,存在vfptr指针(若多继承,可能不止一个)
- 涉及内存对齐机制
【2】注意:
- 类中静态成员变量存储在静态区,类中成员函数存储在代码区,均不占类的空间
- 所涉及的内存对齐机制与C语言中struct对齐方式类似
- 32位系统中,指针占4个字节;64位系统中,指针占8个字节
- 使用sizeof运算符可以计算某个类所占的内存空间(以字节为单位)
下述案例均在64位系统环境下进行解释!
【3】案例1:空类
#include <iostream>
using namespace std;
class A {
};
int main()
{
cout << sizeof(A) << endl; //1
return 0;
}
案例1的解释说明:空类占1字节内存大小。
【4】案例2:多层继承
#include <iostream>
using namespace std;
class A {
private:
int age;
public:
void test() {}
};
class B : public A {
private:
int age;
double height;
public:
virtual void test1() {}
};
class C : public B {
private:
char c;
};
int main()
{
cout << sizeof(A) << endl;//4
cout << sizeof(B) << endl;//24
cout << sizeof(C) << endl;//32
return 0;
}
案例2的解释说明:
- A类只有int age(4个字节),因此占4字节。
- B类继承了A类,内部就有2个int类型数据(共8字节)、1个double类型数据(占8字节)、1个vfptr指针(占8字节)。由于这里计算的大小为24字节,已经是最大对齐数8的整数倍,因此B类占24个字节。
- C类继承了B类,在B类所占24字节的基础上,多了一个char类型数据(占1个字节)。总共计算得到25字节,但这不是最大对齐数8的整数倍。因此,根据内存对齐机制,C类占32字节。
【5】案例3:菱形继承(钻石继承)
#include <iostream>
using namespace std;
//动物类
class Animal {
public:
int age;
};
//羊类
class Sheep : virtual public Animal {};
//驼类
class Tuo : virtual public Animal {};
//羊驼类
class SheepTuo :public Sheep, public Tuo {};
int main()
{
cout << sizeof(Animal) << endl; //4
cout << sizeof(Sheep) << endl; //16
cout << sizeof(Tuo) << endl; //16
cout << sizeof(SheepTuo) << endl;//24
return 0;
}
案例3的解释说明:
- Animal类仅存在一个int型变量,占4个字节。
- Sheep类虚继承了Animal类,内部有int age变量(4个字节)和vbptr指针(8个字节)。由于最大对齐数为8,因此Sheep类所占内存大小必须是8的整数倍,即16字节。
- Tuo类与Sheep类相同,占16字节。
- SheepTuo类多继承了Sheep和Tuo类,内部有int age(4个字节)和2个vbptr(共16个字节)。根据内存对齐机制,SheepTuo类占内存24字节。