【C语言技能树】位段解析与应用

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. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的。

位段的应用

 在网络流中应用位段机制来节省空间.

总结:

跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。  

完结撒花:

🌈本篇博客的内容【位段解析与应用】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ppeua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值