struct字节计算

若结构体为空,其大小为1;
若不为空,结构体的存储比较复杂,并不是简单的字节相加,比如:

struct student  
{   
    char name;  
    int id;  
    double score;  
};  

按照我们一般的想法结构体的字节数sizeof(student)=1+4+8=13,然而我们在代码中验证后就会发现sizeof(student)=16;这是为什么呢?:原来是因为内存存储的字节对齐 造成的。所谓的字节对齐是为了加快计算机的处理速度,我们一般把数据类型都放在能够被其字节大小整除的地址上。比如对于结构体student,假设此结构体的存储首地址pt能够被1和4,8整除(char ,int和double 的存储字节数),其实事实上计算机也是这样安排的,存储过程如下:
name占一个字节,直接存储
id如果直接存储,则id的存储地址(pt+1)不会被4整除,因此我们为了使字节对齐,就会在name后面填充3个字节然后存储id
score直接存储的地址可以被8整除,所以我们不用填充字节
总的字节数sizeof(student)=4+4+8=16;
为了总结出一般的规律,我们使用偏移量这个概念:结构体成员存储地址与结构体首地址的偏移字节数。计算结构体大小时,请按照以下准则:
1.各成员变量的偏移量必须为该成员大小的整数倍,如不够则在上一个变量后填充字节数
2.在所有成员计算以后,结构体的总大小—必须为成员变量中最宽类型的整数倍,如不够则在最后的变量后填充字节数
例:

struct teacher  
{  
   char name;  
   short age;  
   double salary;  
   int id;  
};  

name 偏移量为0,直接存储1个字节(已占用1个字节)
age 若直接存储偏移量为1,不是2的倍数,所以在name后面填充1个字节然后存储(已占用4个字节)
salary 若直接存储偏移量为4,不是8的倍数,所以age后面填充4个字节(已占用16个字节)
id 若直接存储偏移量为16,是4的倍数,所以直接存储(已占用20个字节)
20不是double(teacher结构体中最宽类型)字节的整数倍,所以填充4个字节使其成为整数倍。最后得出结构体的大小为24个字节。

结构体中包含复合类型

struct A  
{  
    char v1;  
    double  v2;  
};  
struct B  
{  
    int  v1;  
    A   v2;  
    char v3;  
};  

1.复合型变量的偏移量必须为 该变量中最宽数据类型大小 的整数倍;
2.先将复合型变量解散为基本变量,再寻找结构体中最宽的数据类型
3.复合类型中,结构体里面复杂类型字节按整体存储字节计算,但最宽数据类型是在解散为基本变量的情况下去找。
上述例子中srtuct B:
v1偏移量为0,是4的整数倍,直接存储(已占用4个字节)
v2 若直接存储偏移量为4,不是8(v2中最宽数据类型double字节数)的整数倍,所以在v1后填充4个字节数然后存储(已占用24个字节)
v3 若直接存储偏移量为24,是1的整数倍,直接存储(已占用25个字节)
25不是double(B中最宽类型)字节的整数倍,所以填充7个字节使其成为整数倍。最后得出结构体的大小为32个字节

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值