鱼C论坛

 找回密码
 立即注册
查看: 2466|回复: 2

[技术交流] 关于结构体大小问题(本人个人见解,不对请朋友指正)

[复制链接]
发表于 2015-12-29 16:49:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于结构体的大小问题。
在定义变量时,编译器会首先检查变量的长度,而后将变量存到他的倍数的数据地址。
定义结构体时,会首先检查第一个成员的长度,然后将他存到他的倍数的数据地址。
然后存储第二个成员时要检查存储完第一个数据后的地址是不是第二个成员长度的倍数
如果是,就接着存储,如果不是,会开始在这个地址上补,补到是第二个成员的长度的
倍数时在存储第二个成员。

比如
struct Arr

        char a;
        int b;
        double c;
        char s;
        int h;


先检查 char a 大小,为1,。
比如变量存储开始内存为0
第一个成员的大小就是  1  存储完后第地址是1
第二个成员大小是   4
1不是4的倍数,所以会在后面补位,补到是4的倍数位置,1+1+1+1=4;
4是4的倍数,所以第二个成员会从4开始存储   4+4=8
第三个成员大小是  8
8是8的倍数,所以不用补位,直接存储 8+8=16
后面的两个字节由于都比double小,所以都会按照8来存储16+8+8=32

注:如果后面两个按照它本身的大小的倍数存,就不能满足都double的倍数了。


结构体会先检查前面成员的大小,然后按照他的倍数的地址开始存储,不是倍数的
会在后面补字节,直到是他的倍数在开始存储,而后面大字节的成员不会影响
前面小字节的成员的存储大小,只会在存储地址不是倍数时补位,会覆盖他后面所有比他小的成员的存储大小
,让他们按照自己的大小来存储。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-20 15:21:30 | 显示全部楼层
我算出来该结构体大小24,编译器也显示24,不知楼主是否和我一样?另附算法教程http://blog.csdn.net/csw_100/article/details/5495309
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-20 17:58:54 | 显示全部楼层
本帖最后由 Krant5 于 2016-7-20 18:06 编辑

这是字节对齐的问题,应该是四个字节对齐的,我觉得应该是24,可能也跟编译器有关系
aa.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 07:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表