结构体大小的计算方法

结构体在春村过程中会有“内存对齐”的要求。在计算结构体大小的时候,谨记两条规则:
1、上面定义的常量或者变量类型占用的内存大小是下面定义的倍数;

2、计算出的最终值能否整除当前结构体中最大的数据类型。

计算下列结构体的大小:
1、
struct A
{
	int a;
	int b;
};//8

int 类型的常量占用4个字节,两个int型的占用8个字节。
2、
struct B
{
	char a;//1+3
	int b;//4
};//8
char类型占用一个字节,int类型占用4个字节,常规思路会认为占用5

个字节,然而并不是。这里用到第一条规则:上面定义的常量或者变量类型占用的内存大小是下面定义的倍数。原因如下:
由于要保证存储过程中内存对齐,系统将会将三个字节的内存舍弃,而选择从104这个4的倍数的内存下标开始存储b.

3、
struct C
{
	int a;//4
	char b;//1
};//5+3,最终的值能整除单个最大数据类型
如果先定义的是整型类型,其占用4 个字节;再定义char类型

其占用1个字节。按照常规思维模式会认为此结构体一共占用5个字节,但事实上它占用8个字节。这时候由于“内存对齐”应考虑第二条规则:计算出的最终值能否整除当前结构体中最大的数据类型。
4、
struct D
{
struct EE
{
	int a;
	float b;
};

struct E
{
	char c;//1+3
	struct EE d;//8
};//12

char a;//1+1short b;//2int c;//4};//8
char类型占用1个字节,但是下面的short类型占用两个字节,为了保证内存对齐,常量a的下一个单元内存会被空出;而char类型和short类型以及空出的单元内存一共为4字节,刚好是下面int类型所需内存大小的倍数,这样结构体D所占用的内存大小就是8字节。
5、
struct M
{
	short a;//2
	char b;//1+5
	double c;//8
	int *d;//4
	float e;//4
};//24

与结构体D的计算方法相同,需要注意的是,short类型占用2个字节是char类型的两倍,但是char与short类型共占3个字节不是下一个double类型的倍数,这个时候系统就会将下面的五个单元内存空出,再存储double类型常量。
6、
struct EE
{
	int a;
	float b;
};

struct E
{
	char c;//1+3
	struct EE d;//8
};//12

struct F
{
	char c;
	double d;
};//16

 
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值