关于结构体所占字节数,内存对齐心得

【备注】:在VC++6.0平台,32位系统上运行测试
先看一个例子:
【A】struct student
{
    int         num;  
    char      name;
    double  mark;
    

【B】struct student
{
   int         num;
   double  mark;  
   char      name;

也许大家一看这A,B两个结构体不是一样的么想想这个结构体占的字节数?“也许”大家都会以为 A和B结构体所占的字节数都是:sizeof(struct student)=sizeof(char)+sizeof(int)+sizeof(double)=1+4+8=13  个字节,貌似看起来没有问题,但是实际上呢!!!
所占字节数: 【A】:  16个字节    【B】: 24个字节
怎么会这样!!!!
【为什么会这样】:为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
即:
char   偏移量必须为sizeof( char )即1的倍数   

int    偏移量必须为sizeof( int  )即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
float  偏移量必须为sizeof( float)即4的倍数
 

各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充,填充部分没有放任何有意义的东西,结构体的总字节大小必须是该结构中占用最大空间的类型所占用的字节数的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

先看结构体【A】:int num//偏移量为0,满足对齐方式,num占用4个字节;char name //因为前面的num占用4个字节,这时分配的地址对于结构的起始地址的偏移量为4,是sizeof(char)=1的4倍,满足对齐方式,所以char   占用sizeof(char)=1个字节数目,此时给下一个可以分配的地址对于结构体起始地址的偏移量为4+1=5,此时不是下一个sizeof(double)=8的倍数所以不满足对齐方式,所以VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为8,刚好是sizeof(double)=8的倍数,所以把存放 mark 在偏移量为8的地方,该成员变量占用sizeof(double)=8个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:4+1+3+8=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(struct student)=4+1+3+8=16!********同理可得结构体【B】所占内存的字节数是  24~

运行结果如下图所示:

【总结】: 结构体大小不一定是内部变量大小的和!!!!!!!

posted on 2016-11-29 11:07  练小习  阅读(5361)  评论(0编辑  收藏  举报

导航