字节对齐

来源:互联网 发布:如何克服拖延症 知乎 编辑:程序博客网 时间:2024/06/07 01:23

     为了提高CPU访问内存效率,编译器一般会对结构体变量进行字节对齐。

long1, long2类型都为long, long1在内存中的位置正好与内存字边界对齐,CPU存取这个数只需访问内存1次;而long2在内存中跨越字边界,CPU存取这个数则需访问内存2次 由此可以看出,字节对齐主要提高CPU访问内存效率.

一般编译器生成代码时,都会根据各种CPU类型将变量进行对齐,对齐主要针对 struct,union, class类型,对于函数当中的单独变量,地址先后顺序是没有关系,也没有规定的 结构struct 中变量与变量之间的空间叫padding,有时为了对齐在一个结构的最后也会填入padding ,通常叫tailpadding.

对齐规则

每种基本数据类型都有自然对齐值(Natural Align ),实际Align值(Actual Align )与其自然对齐值相等。

1 ) struct 结构实际Align值等于该结构所有成员的实际Align值中最大一个成员实际Align 值。

2 ) array 数组实际Align值等于该数组成员的实际Align值

3 ) union联合实际Align值等于该联合最大成员实际Align值

存储空间分配

1 )一个结构成员的偏移(offset )等于该成员实际Align值整数倍,如果凑不成整数倍就在其前加padding 

2 )一个结构的大小等于该结构实际Align值整数倍,如果凑不成整数倍就在其后加tail padding

总结:

为了提高CPU访问内存效率,编译器一般都要对结构体进行字节对齐处理 所以我们在实际编程过程中需要考虑到字节对齐因素,在定义结构体时最好遵循如下原则:

1 )数据类型长度小的成员放在结构体前面,数据类型长度大的成员放在结构体后面

 2 )如果没有特定要求,相同数据类型成员最好放在一起


原创粉丝点击