【C++】<知识点> 类的大小计算

发布于:2024-05-19 ⋅ 阅读:(148) ⋅ 点赞:(0)

【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字节。


网站公告

今日签到

点亮在社区的每一天
去签到