内存数据对齐
对程序员来说,内存就是一个很大的Byte数组,通过程序语言我们可以实现以字节(Byte)为单位对内存进行操作(指针),但是对CPU而言内存的读取是以块(chunk)为单位的,不同的数据类型有不同的访问粒度,也就是chunk的大小不同,1B、2B、4B、8B、16B、32B等。所以访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放。不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。数据对齐(Data Alignment) 这个要求可以提高存储器系统的性能,减少寻址次数,代价是浪费了一些空间。换句话说是用相对廉价的空间换得时间。aligned address:数据所在内存的起始地址是访问粒度(数据长度)的整数倍
参考:
http://www.cnblogs.com/zabery/archive/2011/08/09/2132481.html
http://www.cnblogs.com/wanghao111/archive/2009/08/29/1556436.html
自然对齐和强制对齐
参看:http://www.cnblogs.com/hardcandy/archive/2011/08/08/2131377.html
偏移量:min(数据长度,对齐系数#pragma pack(n) )
结构体本身要对齐:min(max成员数据长度,对齐系数#pragma pack(n)) 的整数倍,实际上是约束结构体最后一位成员的填充情况
之所以要制约结构体本身的对齐要求是考虑到结构体会面临数组分配的问题。结构体数组下一个元素的成员之前需要填充。