struct字节计算

来源:互联网 发布:手机图纸算量软件 编辑:程序博客网 时间:2024/04/29 01:15

若结构体为空,其大小为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 0
原创粉丝点击