在开始讲这个之前先用这段代码引入主题
按理说 这个计算的字节大小应该是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环境下,如果在其他平台下,是重新开辟还是继续利用这就不同了。所以在使用位段时要先了解它这个平台的规则在使用位段。
这就是今天所讲的结构体内存对齐规则和结构体位段使用,相信大家一定会理解,如果不理解请私信我,我来帮你解答!!!