什么是位段
位段是通过结构体来实现的一种以位(bit位)为单位的数据存储结构,它可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。由此可以看出,位段是一种节省空间的用法。位段的声明与结构体类似,但有两点不同:
位段的成员必须是整型家族的成员(char、int、unsigned int、signed int……)
位段的成员后面有一个冒号和一个数字
位段是怎么分配内存的
一般情况下位段的成员是同一类型的,不会夹杂不同类型的成员
因为位段本身就是一个非常不稳定的东西,如果成员类型不同的话,就会使得位段变得非常复杂充满了不确定性。
位段的空间是按照需要,以一次4个字节(成员为int)或1个字节(成员为char)的方式来开辟的。
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序因该尽量避免使用位段。
当开辟出来的空间不够位段使用的时候,那个剩余的空间会被浪费掉,然后新开辟一个空间重新存放数据
struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
所以位段S的大小为3字节
位段作及其缺点用
其主要作用就是能够将内存按位使用,提高内存的利用率,节省空间,我们网络协议中的报头就采用位段。
缺点:
主要是其不能跨平台的问题
int型位段成员会被当成有符号数还是无符号数是不确定的
位段中最大位数目是不确定的(在16位机器上int型最大为16,而在32为机器上int型最大为32,如若写成27,那么16位机器就会出问题)
位段的成员在内存中到底是从左向右分配,还是从右向左分配尚未定义
当一个结构体包含两个位段,第二个位段比较大,无法容纳于第一个位段剩余的位时, 是舍弃剩余的位还是利用,是不确定的。