C语言结构体内存空间分配

首先来说如果结构体的内存是按照便捷对齐的话,比如下图的这个结构体:

假如按照边界对齐要求的话,恐怕需要24个字节的存储空间。而short类型和charl类型却仅仅占了不到一个double八个字节的空间。
图中的彩色部分就是根据边界对齐,这三个类型实际所占的空间,可以说大部分的空间就这样白白浪费了。那么问题来了?既然我可以想到这个问题,在编写这个东西的那些工作人员不可能没有注意到吧?
我于是在vs里面对这个程序进行的测试,看看结构体到底是如何进行内存分配的。
我首先用定义了上图的结构体,然后用是sizeof检查它的大小,结果出乎我的意料

不是24,于是我去了结构体的首地址,查看了内存的内部的存储情况,

发现首先起始地址是8或者4的倍数,double占了八个字节(0x0049fdb0~0(ˇˍˇ) 想~9fdb7),short占了两个字节(0x49fdb8~0x49fdb9),char占了一个0x49fdba。这是十一个字节,当仍然有5个字节的浪费。
然后我试着老师启发的把double换到了中间。

变成了24个字节,难道真的执行了边界对齐吗?
打开内存窗口

看来是符合边界对齐了,
然后把double 放在第三个,这次是16和第一次的一样。

short占了2个字节,然后我求出double的起始地址,减去char的结束地址得到的是八,也就是说char分到了6个,但他只用了一个字节。
通过上面的三次测试,
首先结构体的内存分配的起始位置都是4,或者8的倍数,其次结构成员所占的内存空间与其每次的偏移量有关,如果说偏移量能被结构体内最大类型整除,就不需要填充,如果不是就需要填充字节以对齐该成员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值