当我们学完结构体之后,我们就要好好学学结构体实现位段的能力!!!
一、位段是什么?
- 位段的声明和结构体大体相同,但是有两点不一样。
1.位段的成员必须是int ,unsigned int ,或者 signed int。
2.位段的成员后面必须有一个冒号和一个数字。
for example
struct A { int _a:2; int _b:5; int _c:10; int _d:30; };
printf("%d\n",sizeof(struct A));
二、位段的内存分配
1.位段的成员可以是int,unsigned int ,signed int 或者char(他也属于整形家族哦!!!)
2.位段上的内存是需要按照4个字节(int)或者1个字节(char)的方式来开辟的!
3.位段涉及很多不确定因素,位段不是跨平台的,当我们使用可移植的程序时,应该注意避免位段的使用。
每次只会先开辟一个空间,如果不够了则会开辟下一个空间,大大节省了内存
三、位段的跨平台问题
1.int 究竟是有符号还是无符号这是不确定的。
2.位段中最大位的数目不能确定(16位,32位。。。。。)
3.位段中成员在内存从右往左,还是从左往右没有定义。
4.当结构体包含两个位段时,第二个位段成员较大,第一个位段剩余的位无法满足他时,是舍弃还是应用这是无法确定的
总结
跟结构体相比,位段可以节约很大空间,但是会有跨平台的问题存在!!!
所以在使用的时候,我们要谨慎!!!