字节对齐

有效对齐值 = min(结构自身对齐值, 指定对齐值)。

1. 结构自身对齐值:

(1)基本数据类型:char --1, short -- 2, int --4;

(2) 结构体或类:所有成员自身对齐值中的最大值;

2. 指定对齐值

#pragma pack(value) ,另linux下还可用__attribute__() 来指定。

原因:在让每个成员在一次内存访问中被读取或写入。对于32位CPU,一次可以处理32位,也就是4个字节,

实际访问内存,它从4的整数倍的内存地址,一个可以读出4个字节,如地址在0、1、2、3的双字可以一次次处理,而4、5、6、7则要到下一次。
如果不对齐的话,可能出现这样的情况,一个字或是双字恰好跨越了两次访问的内容,比如说它在1、2、3、4,那么要取它的话,必然要访问两次内存。

这样会造成效率的下降。

 

编译器为结构分配的地址要对齐在“有效对齐值”的边界上,即若有效对齐值为N,地址为addr,则

addr % N == 0。

另外,结构体或类的大小有“圆整”要求,即sizof(struct X) % 有效对齐值 == 0。原因:考虑结构体数组,让连续

排列的另外的结构体也满足对齐要求。

在32位CPU上,gcc 和windows 默认是4字节对齐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值