Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。
🌈个人主页:主页链接
🌈算法专栏:专栏链接
我会一直往里填充内容哒!
🌈LeetCode专栏:专栏链接
目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出
🌈代码仓库:Gitee链接
🌈点击关注=收获更多优质内容🌈
位段:
位段是什么:
在结构体中会出现内存对齐的现象,有时会浪费大量的空间,为了优化这种情况,则出现了位段。
struct S { int a : 2;//2个二进制位 int b : 5;//5个二进制位 int c : 9;//9个二进制位 int d : 30;//30个二进制位 }; int main() { cout << sizeof(S); }
位段的成员必须是 int、unsigned int 或signed int ,也就是整形家族,:后跟着这个变量需要分配的二进制位数量。
位段空间的分配机制:
位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟空间。
小于32(8)位时就存入,大于32(8)位时就新开辟空间的这样一个规律来存放空间的。
我们来看看这个例子下位段的空间是怎样进行分配的。
struct S { char a : 2; char b : 4; char c : 5; char d :4; }; int main() { struct S s = { 0 }; s.a = 10; s.b = 12; s.c = 3; s.d = 4; cout << sizeof(S); }
先来看空间,因为是char类型,所以以一个字节八个bite位来开辟空间。
a,b开辟时<8,所以占一个字节 但当c开辟时已经大于一个字节的位置,所以新开辟了一个字节,当d开辟时也需要新开辟一个字节,所以sizeof(S)=3
而结构体s中的存放数据(小端机器)方式是以这样的,0011 0010 0000 0011 0000 0100,换成16进制就是0x32 03 04,我们来看看在Vs2022中是不是这样的
位段的跨平台问题
1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。
位段的应用
在网络流中应用位段机制来节省空间.
总结:
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
完结撒花:
🌈本篇博客的内容【位段解析与应用】已经结束。
🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。
🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。
🌈诸君,山顶见!