老铁们,有没有坚持每天敲代码呢?坚持做一件事确实很难,但还是要坚定一点咯!
接下来我们接着上一期的知识进行讲解!
结构体传参
结构体实现位段
什么是位段
struct A
{
int _a:2;这里的数字大小表示的是比特位
int _b:5;
int _c:10;
int _d:30;
};
上述的就是一个位段类型,那么它所占的内存大小又是多少呢?
这里我们看到是8个字节大小的,那么如何得来的,我们最后返回来再讲。
位段的内存分配
struct S
{
char a : 3;
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;
return 0;
}
上述代码中空间是如何开辟的呢?我们一起来探讨一下:上面的代码中,先是一个char类型的,1个字节,等于8个比特位,a占了三个比特位。接着是char b,占了4个比特位,然后是char c占了5个字节。
字符a应该从左开始呢?还是从右边开始呢?在C语言中并没有标准的规定!那么我就先假设在的vs中是从右向左使用!接着第二个问题又来了,当剩余的不满足下一个元素的时候,是舍弃该部分的空间,还是挨着占空间呢?
那么在C语言中也还是没有给出标准的规定, 那我就先假设是如果剩余的空间不够下一个成员使用,那么就浪费其空间!接下来就是验证我们的假设了!
如果在vs中是按照我所假设的规则实行的话,那么我们在内存中就会看到这样的结果,下面去看看内存: 那么结果也是和我们假设的结果一样,所以在vs中是这样的实现规则!再用到这个知识:位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的, 那么我们就知道了上面的8个字节的大小是怎么来的啦!
位段的跨平台问题
1. int 位段被当成有符号数还是⽆符号数是不确定的。
2. 位段中最⼤位的数⽬不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会 出问题。
位段的应用
1. 位字段标志:位段可以用于表示一组标志位或开关,每个位段可以表示一个特定的标志位。例如,可以使用一个位段来表示一个字节中的各个标志位,每个标志位代表不同的状态或选项。
2. 位图:位段可以用来创建位图(BitMap),用于表示大量的二进制信息。位图被广泛应用于图像处理、压缩算法、数据结构等领域。例如,可以使用位段来表示一个像素的RGB颜色分量,每个分量占用一定的位数。
3. 协议解析:位段可以用于解析和处理网络协议中的各种字段。网络协议中的各个字段通常是按位或按字节对齐的,使用位段可以将这些字段精确地映射到结构体中,方便对协议进行解析和操作。
4. 嵌入式系统:位段可以在嵌入式系统中节省存储空间。在资源受限的嵌入式系统中,使用位段可以减小数据结构的大小,节省内存空间和通信带宽。
5. 位压缩编码:位段可以用于实现位压缩编码(Bit Compression)。位压缩编码是一种将数据在存储或传输过程中进行压缩的技术,通过使用位段来表示特定的数据模式或规律,可以有效地减小数据的大小。
这个应用是在网上搜的,还是有许多用处的哈,哈哈。好了,本期内容就到此了,欢迎小伙伴们留言哦!期待与你们互动!❤❤❤