什么是位段?位段的作用是什么?他与结构体有什么关系?

目录

1.什么是位段?

2.位段的内存分配

判断当前机器位段的内存分配形式


1.什么是位段?

位段的声明和结构是类似的,有两个不同:

1.位段的成员必须是 int、unsigned int 或signed int或char 。

2.位段的成员名后边有一个冒号和一个数字。冒号后面的数字代表这个成员变量占的比特位。注意是比特位,不是字节。

但是位段与结构体是两个不同的概念,位段基于结构体,与结构体的使用非常类似,比如

什么是位段?位段的作用是什么?他与结构体有什么关系?_第1张图片

那么struct 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. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

为什么说位段具有不确定因素呢?还是以前面的例子为代表

什么是位段?位段的作用是什么?他与结构体有什么关系?_第2张图片

再创建_a的时候,开辟了4个字节也就是32个比特位,然后用了两个,剩下了30个比特位,那这里就有不确定因素

什么是位段?位段的作用是什么?他与结构体有什么关系?_第3张图片

比如这2个比特位是在刚才开辟的空间的左边还是右边?

接着创建了_b变量,占5个字节,接着在剩下的30个bit里面放5个,接着创建_c又放了10个,这时候还剩下15个,此时创建_d要占去30个bit,剩下的位置已经不够放了,只能再申请一块32bit的内存,那这里又有不确定因素了,新申请的空间能直接放下_d,那么原来剩下的15个bit还放不放?是先放15个到上一块空间中,再放15个bit到新申请的空间中,还是直接放30个bit到新申请的空间中?这些都是不确定因素,C语言并没有规定。

判断当前机器位段的内存分配形式

什么是位段?位段的作用是什么?他与结构体有什么关系?_第4张图片

有这样一个位段,在我使用sizeof计算这个位段大小的时候发现是3个字节,那么S在内存中就有可能是这样存的

什么是位段?位段的作用是什么?他与结构体有什么关系?_第5张图片

我画的是从右往左存的,当然也可能是从左往右存的,但是目前能确定的是这里如果原来开辟的内存不够用了,再申请一块新空间的时候,原来剩下不够的那些内存没有使用

再来测试一下是从左往右还是从右往左

什么是位段?位段的作用是什么?他与结构体有什么关系?_第6张图片

对s进行如图的初始化,假如是从右往左放的话,内存中的存储应该是这样

什么是位段?位段的作用是什么?他与结构体有什么关系?_第7张图片

换算成16进制应该是620304,通过的调试,发现确实如此。

因此在当前环境下位段就是从右往左,不够的空间就不用的方式分配内存。

你可能感兴趣的:(c语言,c++,数据结构,开发语言,算法)