结构体内存对齐和位段的内存分配

在开始讲这个之前先用这段代码引入主题

按理说 这个计算的字节大小应该是6个字节,那我们来看下结果是多少

结果是8个字节,这里就涉及了结构体的内存对齐和偏移,现在来告诉大家这个结构体的内存对齐规则,如下:

我相信看到这些你还是会一脸懵逼,不过不影响,我刚开始也是这样,现在就给大家讲解最简单的理解方法,请看下图:

如图可知,这个结构体目前占了8个字节,因为这个结构体里面有两类成员,分别是char和int类型,较大字节是4个字节,四个字节是8的倍数,所以这个结构体最后结果占8个字节。

总结一下:

在vs环境下,默认对齐数是8个字节,如果你的成员所占的字节小于8,那就把它对应到它所占字节的整数倍处即可,例如,int 类型只需把它对应到内存的4的整数倍处,char 类型只需把它对应到内存为1的整数倍处,如果你的一个类型所占字节大于8个字节,那就较小字节就是默认对其数,8个字节,只需把它对应到8个字节倍数的内存处即可。ps:对应时是从前往后依次对应,就是一个一个字节往后找他的倍数处,不可跨字节去寻找,而是应该从前往后依次寻找倍数位置处。

ps:每个操作环境下默认对应的最大字节都不一样,可能会出现一些不同,但是对应方法都一样。

如何修改默认的对其数,这也是有办法的,操作如下:

只需在要计算结构体大小之前加上#pragam pack( 数字 )即可,括号里面时默认的对其数,上述操作把最大默认对齐数改为了 1 ,这样计算下来,总共结构体所占字节就为6。

那为什要有内存对齐呢,如上例子,6个字节不是更加节省内存吗,其实也是有原因的,原因如下:

上面大家可能看不太明白,简单来说就是:例如在vs环境下,默认对齐数是8的时候一次会拿出8个字节,这样不会破坏所储存的数据,如果默认对齐数是3的话,这样一次拿出三个字节对于int类型数据就会被破坏,一次拿出8个字节,就不会破坏数据,而且这样那会更加节省时间,也就是用空间来换取时间的做法。

现在咋们再说位段内存分配

位段是用来干嘛的,我相信大家很好奇,位段其实是用来节省空间的。

并且  后面的数字代表成员所占的 bit 位 。

请先看一下代码:

本来储存这个结构体按照上面结构体内存对齐就需要3个字节,但是现在只需要2个字节即可储存,代码如下:

这是如何实现的呢,前提是你已经提前知道了这个c1,c2,c3只需要几个bit位就可以储存,现在就可以用位段来规定它的大小,这样更加节省空间,我相信你肯定很好奇他是如何实现的,现在就告诉你:

如图所示,应该很清楚的能理解位段的储存是怎样实现的吧,在内存中它也是这样储存的,再看下面它所占的内存空间:

如图所示,它就占两个字节,它是如何来的呢,再看下面:

这就是位段如何节省内存的方法,应该很容易理解吧!!!

但是位段也有缺点如下:

上面当一个字节不够时重新开辟一个空间是在vs环境下,如果在其他平台下,是重新开辟还是继续利用这就不同了所以在使用位段时要先了解它这个平台的规则在使用位段。

这就是今天所讲的结构体内存对齐规则和结构体位段使用,相信大家一定会理解,如果不理解请私信我,我来帮你解答!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值