结构体大小计算pack最终大小成员放置完后的偏移量向上补齐到min(最大成员自然对齐,pack)的整数倍。1.确定两值成员对齐值控制这个成员自己应该放在哪个偏移位置比如double不能放在地址不能被8整除的位置。 整体对齐值控制整个结构体的大小应该是多少的倍数方便用数组存放时每个结构体元素都能自然对齐。每个成员的对齐值 min(自身自然对齐, pack)整体对齐值 min(最大自然对齐8, pack4) 4例子#pragmapack(4)structOne{doubled;//每个成员的对齐值min(8,4)4/* 从0开始然后占八字节下一个开始的地址为8 */charc;//每个成员的对齐值min(1,4)1/* 从8开始然后占1字节下一个开始的地址为9 */inti;//每个成员的对齐值min(4,4)4/* 9不是成员的对齐值4的整数倍所以 从12开始然后占4字节下一个开始的地址为16 */}//整体对齐值 min(最大自然对齐8, pack4) 4//最终的16是4的整数倍那么就得到最后的值为16根本判决方法 确定每个成员对齐值那么就是确定他们的 起始位置 必须为 成员对齐值的整数倍。 整体对齐值就是最终当你得出大小的时候要看是不是整体对齐值的整数倍。2.示例2.1 混合类型structA{chara;// 1/* PACK(4):每个成员的对齐值min(1,4)1 从0开始偏移1字节下一个从1开始 */---------------------------------/* PACK(8):每个成员的对齐值min(18)1 从0开始偏移1字节下一个从1开始 */intb;// 4/* PACK(4):每个成员的对齐值min(4,4)4 从1开始不是四的整数倍 从4开始偏移4字节下一个从8开始 */--------------------------------/* PACK(8):每个成员的对齐值min(4,8)4 从1开始不是4的整数倍 从4开始偏移4字节下一个从8开始 */shortc;// 2/* PACK(4):每个成员的对齐值min(2,4)2 从8开始偏移2字节下一个从10开始 */---------------------------------/* PACK(8):每个成员的对齐值min(2,8)2 从8开始偏移2字节下一个从10开始 */};//整体对齐值 min(最大自然对齐4, pack4) 4//最终的10不是4的整数倍那么就得到最后的值为12-----------------------------------------//整体对齐值 min(最大自然对齐4, pack10) 4//最终的10不是4的整数倍那么就得到最后的值为122.2包含doublestructB{chara;// 1/* PACK(4):每个成员的对齐值min(1,4)1 从0开始偏移1字节下一个从1开始 */---------------------------------/* PACK(8):每个成员的对齐值min(1,8)1 从0开始偏移1字节下一个从1开始 */doubleb;// 8/* PACK(4):每个成员的对齐值min(8,4)4 从1开始不是4的整数倍 从4开始偏移8字节下一个从12开始 */---------------------------------/* PACK(8):每个成员的对齐值min(8,8)8 从1开始不是8的整数倍 从8开始偏移8字节下一个从16开始 */intc;// 4/* PACK(4):每个成员的对齐值min(4,4)4 从12开始偏移4字节下一个从16开始 */---------------------------------/* PACK(8):每个成员的对齐值min(4,8)4 从16开始偏移4字节下一个从20开始 */};//整体对齐值 min(最大自然对齐8, pack4) 4//最终的16是4的整数倍那么就得到最后的值为16-----------------------------------------//整体对齐值 min(最大自然对齐8, pack8) 8//最终的20不是8的整数倍那么就得到最后的值为242.3.结构体成员的自然对齐都小于 packstructC{chara;// 1shortb;// 2charc;// 1};pack4-----6pack8-----62.4数组和嵌套结构体structD{chararr[3];// 3个char自然对齐1intx;// 4shorty;// 2};pack4-----12pack8-----12最后两个用来自我检测