自己总结了个规律:
a 每个成员的首地址必须是min(自己的大小,指定的对齐数)的整数倍。
a 每个成员的首地址必须是min(自己的大小,指定的对齐数)的整数倍。
b 整个结构的大小必须是min(最大成员大小,指定的对齐数)的整数倍。
另:各个编译器的默认对齐规则不一样,一般VS 是8, gcc是4,测试时可以自己指定
这篇博文描述得很详细:http://blog.csdn.net/21aspnet/article/details/6729724