我把字节对齐的分为两步: 1. 求“有效对齐值” a). 先求成员中“最大对齐值”,即成员中最大成员的大小,如果成员中含有结构体A,则是A中最大成员的大小。 b). 求“指定对齐值”,编译器默认为8,可以通过#pragma pack (value)指定 有效对齐值 = 最大对齐值与指定对齐值之中的较小值。 2. 各成员应按照“有效对齐值”与自身大小进行内存分配。 从第一个成员开始 a) 先分配一个“有效对齐值”大小的内存空间,存放第一个成员,如果空间不够,则扩大空间,但扩大后必须是“有效对齐值”的整数倍;如果足够存放,看能不能容纳下一个成员,如果能就存放下一个成员,如果不能则再分配一个“有效对齐值”内存空间,前面的内存空间有多余没有利用的填充(padding)起来。 b) 后面每一个成员重复步骤a) c) 最后一个成员如果比较小,不能满足 整个结构体的大小%有效对齐值 = 0,那么填充空余的部分,使其整个结构体的大小%有效对齐值 = 0。 网上有很多类似的计算,原理都差不多,这个是我自己理解的,感觉还是比较易懂, 按照这种方法试过很多结构体的计算,准确率100%。