#include "stdafx.h" struct { short a1;//偏移量为0,是sizeof(short)的倍数 short a2;//偏移量为2,是sizeof(short)的倍数 short a3;//偏移量为2+2,是sizeof(short)的倍数 }A;//VC必须保证结构的大小为结构体字节边界数2的倍数,结构体大小为6满足条件 struct { long a1;//偏移量为0,是sizeof(long)的倍数 short a2;//偏移量为4,是sizeof(short)的倍数 }B;//VC必须保证结构的大小为结构体字节边界数4的倍数,结构体大小为6不满足满足条件则需要自动填充两个字节 struct example1 { short a;//偏移量为0,是sizeof(short)的倍数 long b;//偏移量为2,不是sizeof(long)的倍数,所以需要填充两个字节后再存b };//VC必须保证结构的大小为结构体字节边界数4的倍数,结构体大小为2+2+4满足条件(8字节) struct example2 { char c;//偏移量为0,是sizeof(char) == 1的倍数 example1 struct1;//偏移量为1,struct1占8个字节,但是其对齐方式是按照其成员中最大的一个数据对齐也就是4,所以需要补充3字节 short e;//偏移量为1+3+8,为是sizeof(short)的倍数 };//VC必须保证结构的大小为结构体字节边界数8的倍数,结构体大小为1+3+8+2=14不满足条件,则需要自动填充2个字节(16字节) int main(void) { int iShort = sizeof(short);//2 int iLong = sizeof(long);//4 int a = sizeof(A);//6 int b = sizeof(B);//8 example2 e2; int d = (unsigned int) & e2.struct1 - (unsigned int) & e2.c;//??? printf("%d,%d,%d/n", sizeof(example1), sizeof(example2), d); return 0; } //各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。 //同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成 //员变量申请空间后,还会根据需要自动填充空缺的字节。