在vchelp上ll199(赵小雅)的耐心教导下,我终于明白了使用sizeof来得到struct的原理,首先表示一下感谢。
首先拉来看个例子:
struct test
{
char a;
int b;
};
int main()
{
int nSize = sizeof(test);
return 0;
}
在使用vc编译器默认设置下得到的nsize是8,而不是5.为什么要这样呢?
原来在cpu寻址是是8的倍数的地址是最容易找到的,所以在vc默认编译情况下,都会把结构体按8字节对齐,这样就可以提高了编译出来效率。
vc在project->setting->c/c++中的struct member alignment中可以设置结构体补齐方式,默认情况下是8,如果改成1的话,上面的sizeof得到的结果就是5了。
那么现在我们还是用默认的8字节方式,把int b改成short b,得到的结果是多少呢?哈,是4.
原来struct的对齐机制里面还有另外一个规则就是首先计算结构体内所有基础类型的长度,最大的长度如果小于vc设置的对齐长度的话,就按最大长度作为结构体的对齐方式。如上面改成short以后,结构体内最大对齐长度是2(short),所以最终的结构体是按2字节来补齐的,而不是默认的8字节。
最后发表一下感想,大家多到vchelp去逛逛,可以学到不少东西:)