background image

偏移量必须为 sizeof(double)即 8

 

的倍数

Short 
偏移量必须为 sizeof(short)即 2

 

的倍数

各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照
上面的对齐方式调整位置,空缺的字节 VC 会自动填充。同时 VC 为了确保结
构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字
节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动

 

填充空缺的字节。
下面用前面的例子来说明 VC

 

到底怎么样来存放结构的。

struct MyStruct 

double dda1; 
char dda; 
int type 
}

 

为上面的结构分配空间的时候,VC 根据成员变量出现的顺序和对齐方式,先
为第一个成员 dda1 分配空间,其起始地址跟结构的起始地址相同(刚好偏移
量 0 刚好为 sizeof(double)的倍数),该成员变量占用 sizeof(double)=8 个字节;
接下来为第二个成员 dda 分配空间,这时下一个可以分配的地址对于结构的起
始地址的偏移量为 8,是 sizeof(char)的倍数,所以把 dda 存放在偏移量为 8 的

 

地方满足对齐方式,该成员变量占用 sizeof(char)=1 个字节;接下来为第三个
成员 type 分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移
量为 9,不是 sizeof (int)=4 的倍数,为了满足对齐方式对偏移量的约束问题,
VC 自动填充 3 个字节(这三个字节没有放什么东西),这时下一个可以分配
的地址对于结构的起始地址的偏移量为 12,刚好是 sizeof(int)=4 的倍数,所以
把 type 存放在偏移量为 12 的地方,该成员变量占用 sizeof(int)=4 个字节;这
时 整 个 结 构 的 成 员 变 量 已 经 都 分 配 了 空 间 , 总 的 占 用 的 空 间 大 小 为 :
8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占
用的字节数 sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整
个结构的大小为:sizeof(MyStruct)=8+1+ 3+4=16,其中有 3 个字节是 VC 自动

 

填充的,没有放任何有意义的东西。
下面再举个例子,交换一下上面的 MyStruct 的成员变量的位置,使它变成下

 

面的情况:
struct MyStruct 

char dda; 
double dda1;   
int type 
}

 

这个结构占用的空间为多大呢?在 VC6.0 环境下,可以得到 sizeof(MyStruc)为
24。结合上面提到的分配空间的一些原则,分析下 VC 怎么样为上面的结构分

 

配空间的。(简单说明)
struct MyStruct