图1
位段的作用主要是节省内存空间。
首先解释一下图1中的三个关于位段的说明
位段的成员只能是整型家族:int \ unsigned int \ signed int 或者 char,呃,我寻思这个应该不用说。
第二个点是位段的空间上是按照四个字节(int)或者一个字节(char)开辟的
比如说
struct A
{
int _a:2; //成员占2个bit位 , int 开辟了四个字节
};
或者
struct S
{
char a:3;//成员占3个bit位 , char 开辟了一个字节
};
哦这里说明一下,一个字节有八个比特位
然后最后一个点就是位段在不同的软件可能设置是不一样的,所以在VS平台适用的规则在别的平台不一定适用。
图2
下面来讲一下图2关于位段跨平台问题的内容
第一个点呃大家看一下记一下。
第二个点位段最大位的数目不能确定,这个有一点抽象,比如 在32位系统中 int 类型是四个字节的,16位系统中 int 是 两个字节,那么在初始化比特位的时候 int 类型在32位系统中不能超过32个比特位,在16位系统中不能超过16个比特位。
第三个点我们举个例子
比如下图
首先char类型占有一个字节,一个字节有八个比特位,所以此时我们可以放入八个比特位的内容,s.a =10,我们可以看到 char a:3;即 a 中最多存储三个比特位的数,10的比特位为1010,存储到a 开辟的一个字节中的三个比特位后变为 010 ,而且是从右向左储存,如果下一个要储存的数可以被此时 a 开辟的字节空间容纳,那么便会储存在 a 的空间中,否则就会再开辟一个字节空间进行存放, a开辟的字节的剩余空间将被废弃。
哎,这个例题好像把第四问也解决了。OKOK。
所以总结就是:位段可以节省空间,但是跨平台有风险。
上面是位段的一些运用。