meo学习笔记4:C++中对象占用内存情况

C++中一个对象到底占用多少内存?

1.前言

这个问题对于开发可能不是那么的关注,但是其实在C++相关的题中却经常出现,下面将针对性的记录说明下这个问题

2.直蹦主题

2.1 重要结论

1)非静态成员函数的总和
2)考虑CPU的运算,不同大小的变量,会按最大类型以单位采取对齐策略,
3)当存在虚函数时建立虚函数表会增加额外的内存开销

2.2 测试说明

根据以上结论,下面进行测试,更容易理解:

// 无成员函数和成员变量,由于对象地址的独立性,也将占有1字节
class TestSize0
{

};

// 拥有成员函数: 成员函数们不占用内存,还是一字节
class  TestSize1
{
public:
	 TestSize1();
	~ TestSize1();
	void fun1() {};
	void fun2() {};
};


// 拥有一个int成员变量: int占4字节
class  TestSize2
{
public:
	TestSize2();
	~TestSize2();
	
	int i2;
};

// 拥有一个int和一个char成员变量,将对齐 4 + 4 = 8
class  TestSize3
{
public:
	TestSize3();
	~TestSize3();

	int i3;
	char c3;
};

// 拥有一个int和两个个char成员变量,将对齐 4 + 4 = 8
class  TestSize4
{
public:
	TestSize4();
	~TestSize4();

	int i4;
	char c4, c42; // 对齐后为4足以存下两个char
};

// 含有虚函数将额外的增加内存(虚函数表),具体大小同编译器相关吧,我这个为8
class  TestSize5
{
public:
	TestSize5();
	~TestSize5();

	virtual void fun() {};
};

// 含有两个虚函数的,并不是加个虚函数就得加内存,还是输出8
class  TestSize6
{
public:
	TestSize6();
	~TestSize6();

	virtual void fun1() {};
	virtual void fun2() {};
};

// 这个呢? 3 * 8 = 24
class  TestSize7
{
public:
	TestSize7();
	~TestSize7();

	void fun1() {};
	virtual void fun2() {}; // 8

	int i7;					// 4→8(还剩下4没用)
	char c7[5];				// 5→8 (int多出来的4存不下,必须重新拿下个8)
};

// 含有的静态成员不占用栈内存: 8 * 2 = 16
class  TestSize8
{
public:
	TestSize8();
	~TestSize8();

	void fun1() {};
	virtual void fun2() {}; // 8

	static int i8;			// 静态不占用栈内存
	char c8[5];				// 5→8 
};

int main()
{
	cout << "无成员函数和成员变量的空类 TestSize0:" << sizeof(TestSize0) << endl;
	cout << "含有成员函数的类 TestSize1:" << sizeof(TestSize1) << endl;
	cout << "含有一个int成员变量的类 TestSize2:" << sizeof(TestSize2) << endl;
	cout << "含有一个int和char成员变量的类 TestSize3:" << sizeof(TestSize3) << endl;
	cout << "含有一个int和两个char成员变量类 TestSize4:" << sizeof(TestSize4) << endl;
	cout << "含有一个虚函数的类 TestSize5:" << sizeof(TestSize5) << endl;
	cout << "含有两个虚函数的类 TestSize6:" << sizeof(TestSize6) << endl;
	cout << "练习一下呢 TestSize7:" << sizeof(TestSize7) << endl;
	cout << "含有静态成员 TestSize8:" << sizeof(TestSize8) << endl;
	
	system("pause");
	return 0;
}

测试结果:
在这里插入图片描述

3.最后

以上就是针对这个问题的比较针对性的回答,其中还有些原理性,另外还有针对基类的相关问题没有阐述,下次再说吧,如有问题还请联系修正!

参考链接:
C++一个类的内存占用情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值