目录
1.什么是位段?
2.位段的内存分配
判断当前机器位段的内存分配形式
1.什么是位段?
位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int或char 。
2.位段的成员名后边有一个冒号和一个数字。冒号后面的数字代表这个成员变量占的比特位。注意是比特位,不是字节。
但是位段与结构体是两个不同的概念,比如
那么A就是一个位段类型,注意不是struct A,而是A就是一个位段类型。用A创建的变量,就是位段类型变量。
他表示_a占2个比特位,_b占5个比特位,以此类推。通过sizeof计算A的大小,发现是8个字节。
为什么要有位段呢?假如我只需要_a表示四种情况,那么两个比特位就足够了,但是int类型的_a我们却为他开辟了32个bit位,实际有30个bit浪费了,因此位段是一种节省空间的方法。
2.位段的内存分配
1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
为什么说位段具有不确定因素呢?还是以前面的例子为代表
再创建_a的时候,开辟了4个字节也就是32个比特位,然后用了两个,剩下了30个比特位,那这里就有不确定因素
比如这2个比特位是在刚才开辟的空间的左边还是右边?
接着创建了_b变量,占5个字节,接着在剩下的30个bit里面放5个,接着创建_c又放了10个,这时候还剩下15个,此时创建_d要占去30个bit,剩下的位置已经不够放了,只能再申请一块32bit的内存,那这里又有不确定因素了,新申请的空间能直接放下_d,那么原来剩下的15个bit还放不放?是先放15个到上一块空间中,再放15个bit到新申请的空间中,还是直接放30个bit到新申请的空间中?这些都是不确定因素,C语言并没有规定。
判断当前机器位段的内存分配形式
有这样一个位段,在我使用sizeof计算这个位段大小的时候发现是3个字节,那么S在内存中就有可能是这样存的
我画的是从右往左存的,当然也可能是从左往右存的,但是目前能确定的是这里如果原来开辟的内存不够用了,再申请一块新空间的时候,原来剩下不够的那些内存没有使用
再来测试一下是从左往右还是从右往左
对s进行如图的初始化,假如是从右往左放的话,内存中的存储应该是这样
换算成16进制应该是620304,通过的调试,发现确实如此。
因此在当前环境下位段就是从右往左,不够的空间就不用的方式分配内存。