原因
各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。
不对齐可能会发生读取错误;或一次数据需要读取2次;
准则
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
一些概念
类型的对齐要求可以通过 _Alignof 获得。(C11 起)
alignof()
#pragma pack (value)
__attribute__((packed)) ;gcc中允不允许指定几个字节的对齐呢?