结构体的内存
 
一、对齐规则
 
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)