目录
- 1. 什么是位段
- 2. 位段的内存分配
1. 什么是位段
结构体中可以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”( bit field) 。利用位段能够用较少的位数存储数据。
位段的好处:
- 位段可以使数据单元节省储存空间
- 位段可以很方便的访问一个整数值的部分内容从而可以简化程序源代码
此外
- 位段是定义在结构体中的
- 位段成员数据类型可以是
int
,unsigned int
,signed int
,char
,unsigned char
,signed char
类型 - 位段空间是按需以4个(int型)或1个(char型)字节来开辟的
- 位段不可跨平台,所以可移植的程序应避免使用位段
struct A
{int _a : 2;int _b : 3;char c : 1;char d : 4;
};
2. 位段的内存分配
对于下面这个结构体中的位段
struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};
内存分配图如下(VS环境)
注意:
- 这里位段类型为char,所以当比特位不够时每次补充一个字节的空间
- 位段存在跨平台的问题,当一个位段成员存储后的空余空间无法完整容纳下一个位段成员时,是将空余内存空间舍弃还是利用,是不确定的
- 并且位段成员的内存是从左向右还是从右向左分配也是不确定的
与结构体将比,位段能够更大限度的节约内存空间,但是存在跨平台问题, 需谨慎使用。
练习:
unsigned char puc[4];struct tagPIM{unsigned char n;unsigned char a : 1;unsigned char b : 2;unsigned char c : 3;}*pstPimData;pstPimData = (struct tagPIM*)puc;memset(puc,0,4);pstPimData->n = 2; pstPimData->a = 3;pstPimData->b = 4;pstPimData->c = 5;printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);
vs环境下其内存分布分析
即打印结果为 02 29 00 00