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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值