栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++之类的大小

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++之类的大小

一、普通类的大小
#include


using namespace std;

class MyClass
{
public:
	MyClass(){
		int i = 0;
		float f = 0.01f;
	};
	int getI(){
		return i;
	}
	int getF(){
		return f;
	}

private:
	int i;
	float f;
	//静态变量实际上是其全局变量,它存储在全局/静态存储区,不占对象空间
	static int staNum;
	
};

int MyClass::staNum = 2;

int main()
{

	MyClass myclass;
	cout << "myclass的大小" << sizeof(myclass) << endl;

	return 0;
}


我们可以看到,在创建类的对象中,真正占据栈空间的只有两个成员变量,分别为4个字节。静态成员变量实际上与全局变量一起存储在全局存储区,而成员函数则与其他函数一样存在于代码区。

二、空类的大小
#include


using namespace std;

class MyClass
{
public:
	MyClass(){};
	
private:
	
};


int main()
{

	MyClass myclass;
	cout << "myclass的大小" << sizeof(myclass) << endl;

	return 0;
}


在使用类的指针的时候,如果类的的大小为0,那么排在一起的几个空类地址都是一样的话,我们又怎么知道是哪个呢?

三、自动填充类或者结构体的大小
#include


using namespace std;

struct MyStruct1
{
	bool b1;
	bool b2;
	int i1;
};

struct MyStruct2
{
	bool b1;
	int i1;
	bool b2;
};

struct MyStruct3
{
	bool b1;
	short s1;
};


int main()
{

	MyStruct1 s1;
	MyStruct2 s2;
	MyStruct3 s3;

	cout << "MyStruct1的大小" << sizeof(s1) << endl;
	cout << "MyStruct2的大小" << sizeof(s2) << endl;
	cout << "MyStruct3的大小" << sizeof(s3) << endl;


	return 0;
}


当我们按照不同的的顺序排列变量的时候会发现,类的大小是不尽相同的。第一种情况,MyStruct中的两个布尔连在一起,如果后面没有变量,编译器会自动填充2个字节;而现在后面还有一个整形i,整形跨越了两个4字节,在读取整形的时候需要两个4字节,因此编译器会在这种情况下也会在i1填充2个字节,从而是i1在下一个字节开始。对于第二种情况,MyStruct2中由于两个布尔类型被整形隔开,我们需要两次填充。第三种情况,MyStruct3中由于short只有两个字节,因此只需要填充一个字节。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779376.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号