白鹭炖什么好吃:vc里的结构字节边界(Struct Member Alignment)是怎么回事?

来源:百度文库 编辑:高校问答 时间:2024/04/27 21:39:53
我看了一下文档,缺省是8字节边界,vc里也的确这样设置的,可是实际编译后结果怎么好像是2字节边界?比如我结构里第一个member是short,第二个member按文档应落在4字节后,可实际上依然是落在2字节后。另外结构大小用sizeof计算后得到的是什么大小?是结构实际内存的大小还是逻辑上的大小?

呵呵,[结构字节对齐]在VC的表现是:VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数,同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节

举个例子:
struct MyStruct

{

double a;

char b;

int c

};

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

由上面可知 sizeof 的结果是填充后的结果.

至于OPTION,LZ的设置的确可以指定对齐的字节数,LZ可以试试下面的预编译命令,至少我用到现在是没有问题的.:
#pragma pack(你要限定的对齐数)

至于LZ的document,应该是C/C++的spec吧,微软可没说VC就一定是遵循这个规范的呵呵(连最简单的++,--操作符,微软VC都没有遵循~),这个也是学习者不适合使用VC来做练习的原因,上面的VC的字节对齐方式可以在VC程序员向导里面找到,LZ可以去微软网站下载电子版本查询