struct和class内存大小的计算

Posted wuyepeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struct和class内存大小的计算相关的知识,希望对你有一定的参考价值。

结构体内存大小的计算:

用例一:

#include<stdio.h>
union ss
{
	int a;
	char b;
};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//一个字节,补齐3个字节
	ss aa;//4个字节
	char temp3;//一个字节
	char temp4;//一个字节,补齐两个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出 16

解析:对齐规则是按照成员的声明顺序,依次安排内存,对齐字节数为最大成员变量的字节大小,偏移量为最大成员变量的字节数的整数倍,在这个程序中对齐字节数为4,计算步骤如下:

首先是temp1 四个字节,temp2 一个字节,还剩3个字节,因为后面是aa 4个字节,可以自己对齐,所以temp2需要补齐3个字节, temp3 一个字节,temp4一个字节,对齐是4个字节,还剩2个字节需要补齐。所以总共是16个字节。

#include<stdio.h>
union ss
{
	int a;
	double b;
};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1个字节,对齐是8个字节,还需3个字节补齐
	ss aa;//8个字节
	char temp3;//1个字节
	short temp4;//2个字节,补齐还需要5个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出结果为 24

#include<stdio.h>
union ss
{
	int a;
	double b;
};

struct student
{
	int name;
	char sex;
	double num;

};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1一个字节,补齐3个字节
	ss aa;//8个字节
	char temp3;//一个字节
	short temp4;//2个字节,补齐5个字节
	student people;//16个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  结果为 40

解析:此时需要注意的是,对齐字节数8个字节,而不是16个字节。student people 对象内部先进行一次对齐,然后如果如果是外面对齐字节数的整数倍就不需要

再进行对齐了,如果不是就需要再次进行对齐。

下面的是需要二次对齐的程序:

#include<stdio.h>
struct MyStruct
{
	char temp1;
	char temp2;
};
struct student
{
	int name;//4个字节
	char sex;//1个字节
	MyStruct aa;//2个字节
	char temp;//1个字节

};
int main()
{
	printf("%d", sizeof(student));

}

  输出为 8 

#include<stdio.h>
union ss
{
	int a;
	double b;
};

struct student
{
	//int name;
	//char sex;
	int num;

};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1一个字节,补齐3个字节
	ss aa;//8个字节
	char temp3;//1个字节
	short temp4;//2个字节
	student people;//4个字节,补齐一个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出结果为:24 

 

总结,在一个结构体中有另一个结构体的对象时,对齐字节数与这个结构体对象的字节数无关,只与结构体中的成员变量和union 有关。

 

类的内存大小的计算:

#include<iostream>
using namespace std;
class student
{
public:
	student() 
	{
		cout << "构造函数" << endl;
	}
	//void fun();
};
int main()
{
	cout << sizeof(student) << endl;
	return 0;
}

  运行结果: 1

解析:如果是空类也会输出1。如果一个类只含有成员函数没有成员变量或者虚函数,类的大小都是1。如果含有静态成员变量或者是静态成员函数,也会是1,因为静态成员变量和静态成员函数是类的所有对象共享的,它并不存放在一个实例化对象中

为什么空类也会是1呢?

所谓类的实例化就是在内存中分配一块地址,每一个实例在内存中都有独一无二的地址,而了到达这个效果,编译器往往会给一个空类隐含的增加一个字节,这样实例化出来的每一个空类的对象都会得到一个独一无二的地址。如果空类的大小是0的话,那么实例化出来的所有空类对象都是在同样一个内存地址上,就相当于同一个对象,这不是我们想要的。

以上是关于struct和class内存大小的计算的主要内容,如果未能解决你的问题,请参考以下文章

new与malloc的区别struct与class的区别

C/C++ struct/class/union内存对齐

转C/C++ struct/class/union内存对齐

struct结构体计算占内存大小

结构体大小的计算以及内存对其原则和修改默认对齐数

struct结构体内存大小