结构体内存对齐之对齐规则

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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值