1. 如果没有内存对齐,有些数据可能要CPU的二次访问才能取到,因为CPU都是按照块来取数据的
#program pack(show) -- 用于查看当前对齐模数,默认是8
#program pack(1) -- 可以修改对齐模数,必须是2的n次方
2. 如果采用默认对齐模数,则结构体内存对齐,内部对齐规则如下:
1)从第一个属性开始,偏移量为0
2)从第二个属性开始计算偏移,要放在 该类型的大小 的 整数倍 上
3)当所有属性偏移量都计算完成后,结构体再做第二次整体偏移,偏移量根据第4步
4)最后计算结果 要是 结构体中最大数据类型 的整数倍
如采用默认对齐模数8:本应该是20,整体偏移过后所占字节数就是24(必须是最大数据类型double c(所占字节8)的整数倍)
// 假设0~19表示内存地址编号
typedf struct _STUDENT{
int a; //0~3
char b; //4~7
double c; //8~15
float d; //16~19
}Student;
3. 如果修改了对齐模数,则结构体内存对齐,内部对齐规则如下:
1)从第一个属性开始,偏移量为0
2)从第二个属性开始计算偏移,要放在 该类型的大小 与 对齐模数 比较 取小的值的 整数倍 上
3)当所有属性偏移量都计算完成后,结构体再做第二次整体偏移
4)最后计算结果 要是 结构体中最大数据类型 和 对齐模数比 取小的值 的整数倍
如果对齐模数设置是1,则下面结构体所占内存=里面所有数据类型实际大小加起来,该结构体所占内存空间是16(16是1的整数倍)
typedf struct _STUDENT{
int a; //0~3
char b; //4(为什么是4个?)
double c; //5~12
float d; //13~16
}Student;
4. 如果是默认对齐模数8,则嵌套了结构体的结构体所占内存空间大小
注意:该结构体所占内存空间是40(40已经是8的整数倍),所以不需要整体偏移
typedf struct _STUDENT2{
char a; //0~7
Student b; //8~31(8+24-1=31)
double c; //32~39
}Student2;