- 什么是字节对齐
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
基本数据类型自身对齐,也叫自然对齐。就是说数据的存储地址可以被其自身字节长度整除。例如float型的数据存储地址必须为4的整数倍。
- 为什么需要字节对齐
- 字节对齐的方式与原则
方式:字节的对齐方式和处理器位数以及编译器选项有关,一般对于32位机,在vc中默认是4字节对齐的,GNU gcc 也是默认4字节对齐。
也可以通过一些配置,指令,关键字来修改字节对齐方式。
在VC IDE中,可以这样修改:[Project]|[Settings],c/c++选项卡Category的Code Generation选项的Struct Member Alignment中修改,默认是8字节。
使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。#pragma pack (),取消自定义字节对齐方式。
__attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。__attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
原则: 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
- 实例分析
见引用链接:http://blog.csdn.net/21aspnet/article/details/6729724
- 易错点
当计算结构体总体大小时,容易忽略填充,以使总体大小为最宽基本类型成员大小的整数倍。