结构体大小

本文详细解析了结构体内存对齐的原理及其对计算机读取数据的影响,介绍了如何通过填充额外内存空间来提高数据读取效率的方法,并总结了一套实用的计算结构体大小的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体内存对齐      

//结构体大小,存在内存对齐问题

(1)先定义一个结构体A,并将其初始地址设为100

我们通常认为a先申请1个字节,b在申请4个字节大小空间,结构体A总共占5个大小字节

100 101 102 103 104 105 106 107

 abb

  b

b  

 

1+4=5个字节,但其实不是这样

我们来看下结构体正真的申请内存情况:

100 101 102 103 104 105 106 107

a\\\bbbb

1+3+4=8字节 

因为计算机读取数据时,一般标准化4个4个字节读取,所以为了节约时间,我们浪费3个字符大小的内存地址,以空间换取时间。

我们可找出计算结构体的规律

(2)

结构体大小为8,规则和(1)相同,(1+1)+2+4=8(每个类型写起来,上面是否能整除下一行)

(3)

(4)

按照以上规则结构体D应该为(1+3)+4+2=10字节,但实际上12字节

现在我们来考虑一下假设结构体数组的存在:

struct  D  arr[2];

这时arr[1]的地址可能会出现这种情况:

_________________________________________arr[0]________________|_____________arr[1]___________________

这时候计算机以标准4个4个读取时,会在第三个绿色框框处出现问题,读取失败,不是我们需要的值。

所以我们为了避免这个情况,我们会给arr[1]结尾出补上两个字符,就不会出现读取错误了。

这时我们回头看④:我们会发现结构体大小 =(1+3)+4+2+2 = 12个字节

 

我们可以找出规律计算结构体的大小时避免出现以上问题:

就是在计算出结构体大小时,用所得值对结构体内最大的成员大小取余,看是否==0;

如果!=0,我们给补上一个合适大小的内存,让取余==0 。

最后我们总结一下结构体内存对齐的规则:

①:每一行和前面行总和比,不能被整除,则补上。

②:算出总共大小后和单个最大比,不能被整除,则补上

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值