结构体的内存
一、对齐规则
1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个成员在与结构体变量偏移量为0的地址处,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
2.结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
3.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
二、例子
列子1:
struct test1{
int num1;
char ch;
int num2;
}
内存分析
分析:
1. 第一个是int类型,后面每个数据成员存储的起始位置要从该成员大小的整数倍开始算(也就是4的倍数,故char ch 的起始位置是4,int num2的起始位置是8)。
2.char ch只占一个内存,需要补齐三个。
3.判断当前总内存(12)是否是最大成员内存(4)的整数倍,如果不是需要补齐到最大成员内存的整数倍。
列子2:
struct test2{
char num1;
char num2;
double num3;
}
内存分析
分析:
1. 第一个是char类型,后面每个数据成员存储的起始位置要从该成员大小的整数倍开始算(也就是1的倍数,故char num2 的起始位置是1,double num3的起始位置是2)。
2.判断当前总内存(10)是否是最大成员内存(8)的整数倍,如果不是需要补齐到最大成员内存的整数倍(2倍,16)。
3.故double num3的起始位置修改为8,char num1,char num2,补齐到8个内存,故结构体所占内存为16。
列子3:
struct test3{
char num1;
double num3;
char num2;
}
内存分析
分析:
1.当前总内存要是最大成员内存的整数倍,故char num1要补7个。
2.char num2同样要补7个,故结构体的内存为24。
列子4:
struct S1 {
double a;
char b;
int c;
};
struct S2 {
char num;
S1 s;
double d;
};
}
分析:
1.struct S1的内存为16(char b,int c一起补齐8个,共补3个)。
2.S2中嵌套结构体S1(结构体成员要从其内部最大元素大小的整数倍地址开始存储),当前S1中最大元素大小为8,S2中double也是8,故S2最大对齐数是8的倍数
3. char num补齐到8,结构体的总内存为(8+16+8=32)