字节对齐

来源:互联网 发布:公司网络时断时续 编辑:程序博客网 时间:2024/06/10 09:30

有效对齐值 = 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字节对齐。

0 0
原创粉丝点击