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