数据对齐的具体示例

50 阅读1分钟

假设有一个结构体,包含以下几个成员:

一个1字节的byte类型成员b1 一个8字节的double类型成员d1 一个1字节的byte类型成员b2 一个8字节的double类型成员d2 一个1字节的byte类型成员b3 在默认对齐方式下(假设是8字节对齐):

第一个成员b1会放在偏移量为0的位置。 第二个成员d1会放在偏移量为8的位置(因为它是8字节长度,需要对齐到8字节边界)。 第三个成员b2会放在偏移量为16的位置(紧跟在d1后面,但因为d1占用了8个字节,并且为了满足8字节对齐,b2会跳过7个字节到16的位置)。 第四个成员d2会放在偏移量为24的位置(因为它是8字节长度,需要再次对齐到8字节边界)。 第五个成员b3会放在偏移量为32的位置(紧跟在d2后面)。 此时,整个结构体的大小会是40字节(满足最大成员类型double的8字节对齐要求)。

如果改变对齐方式,比如使用#pragma pack(1)进行1字节对齐,那么结构体的大小和成员布局会发生变化,每个成员都会紧密排列,结构体总大小会是11字节(1+8+1+8+1)。但这种对齐方式可能会降低数据访问的效率。