结构体在春村过程中会有“内存对齐”的要求。在计算结构体大小的时候,谨记两条规则:
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