返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言位段(位域)机制结构体的特殊实现及解析
  • 313
分享到

C语言位段(位域)机制结构体的特殊实现及解析

2024-04-02 19:04:59 313人浏览 安东尼
摘要

目录概念内存分配位段跨平台问题作用Tip应用场景概念 什么是位段? 位段又称为位域,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员就叫做称为位段(

概念

什么是位段?

位段又称为位域,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员就叫做称为位段( bit field) 。利用位段能够用较少的位数存储数据达到节省空间的目的。

位段是结构体特有的,所以声明是和结构是类似的,但有两个不同:

1. 位段成员必须是 int ,unsigned int,signed int

2. 位段成员名后边结构包括一个冒号和整型数字

举个栗子:

struct haha
{
    unsigned int ch   : 8;    //8位
    unsigned int chh : 6;    //6位
    unsigned int chhh : 18;   //18位
};
struct haha dest;

内存分配

这里的 haha 就是一个位段的类型,这个神神秘秘的位段咱不常见,那么他的大小怎么算的呢?其实和结构体是一样的:

struct arr
{
int a:2;
int b:5;
int c:10;
int d:30;
};
int main()
{
printf("%d\n",sizeof(struct arr));
return 0;
}

在这里插入图片描述

这里 a:2什么意思呢?

成员 a 只占 2 个比特位,后面同理,既然这样,那我们总计 47 比特位,也就是 6 个字节 48 个比特位已经足够了,那为什么又是 8 呢?位段的内存分配到底是怎样的?

这里千万不要犯低级错误误认为他的大小就是 47 个比特位,和前一篇博客叙述原理相同,因为都是 int 类型,所有成员会向 int 看齐,int 是四字节,默认 8 字节,对齐数取 4 字节,a+b < 1字节,合并申请 1 字节空间,后面都需要独立申请空间,总计 1+2+4 = 7字节,结构体大小必须是最大对齐数整数倍,取 4 的整数倍就是 8,因此为 8 字节。

位段跨平台问题

我们细想刚刚这种机制,a,b,c,d 分别为 2,5,10,30 比特位,而我一个字节是 8 个比特位,假若在给 a 分配了 1 字节后,还剩 6 比特位,这 6 个位子我要不要让给二哥 b 成员来享用呢?==我是一字节一字节榨干资本还是出手阔绰安排"单人房"呢?==这里就有了歧义。

要知道位段在空间上是按照需要以四字节 int 或一字节 char 的方式来开辟空间,他涉及很多的不确定性因素,这就是为什么位段是不跨平台的,注重可移植性的程序应该避免使用位段。

有什么不确定因素呢,就好比我们刚刚提到的内存分配问题,这个问题连C语言标准都没有规定我到底该怎么利用,需要由具体的编译器环境决定,编译器环境又依赖于不同的平台比如 linuxGCc 标准,VS则是 windows 标准。

我们要知道:

  • 1. int 位段被当成有符号数还是无符号数是不确定的。
  • 2. 位段中最大位的数目不能确定(16位机器最大 16,32 位机器最大 32)。
  • 3. 位段中成员的内存从左到右分配还是从右向左分配标准尚未定义。
  • 4. 当一个结构中包含两个位段时,第二个位段成员比较大,无法容纳第一个位段剩余的位时,是应当舍弃还是利用,标准尚未定义。

作用

“ 这么个玄乎的玩意儿拿来干嘛啊 ”你可能会有这样的疑问

我们拿上面的情景来分析一手:

int a:2;
int b:5;
int c:10;
int d:30;

我们不分配位段时,需要 16 个字节,分配后只要 8 个字节,其实位段就是为了节省空间,充当个省流大师。

位段使用的前提条件就是某些细节需要非常明确,假如我成员 a 的取值只有四种状态:00,01,10,11,那我给 a 分配 2 个字节是不是就足够了,那我就给 2 个,我如果一上手啪叽就是一个 int 类型,32 个字节横空出世,这个节省的性价比可不低哦~

当然万事万物不可能十全十美,我帮你节省但总归会有一定浪费,这是不可避免的。总结一下就是位段跟结构相比,可以达到相同效果且可以有效节省空间,但存在跨平台问题存在。

Tip

注意,位段机制跟栈还扯不上关系,入栈的是数据的字节,位段是在这些字节的内部空间上发挥作用,已经细节到“位”了,以及之前提到的大小端模式,大小端是连续字节数据的存放模式,也细化不到字节上。

应用场景

位段在实际生活中也有广泛的应用,比如我们网络上数据包的格式:

在这里插入图片描述


这就是我们在互联网上向某个对象发送信息的原理,里面最大的问题就是这个包如果直接扔到网上去,就会像拖拉机上高速,铁铁的堵车造成网络拥挤,我们就会利用位段机制进行适当缩减以减小网络的负担。

今天就到这里吧,摸了家人们。

以上就是C语言位段(位域)机制结构体的特殊实现及解析的详细内容,更多关于C语言位段位域机制结构体的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言位段(位域)机制结构体的特殊实现及解析

本文链接: https://lsjlt.com/news/139051.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言位段(位域)机制结构体的特殊实现及解析
    目录概念内存分配位段跨平台问题作用Tip应用场景概念 什么是位段? 位段又称为位域,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员就叫做称为位段( ...
    99+
    2024-04-02
  • C语言如何实现位段机制
    这篇文章主要为大家展示了“C语言如何实现位段机制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何实现位段机制”这篇文章吧。概念什么是位段?位段又称为位域,C语言允许在一个结构体中以位为单...
    99+
    2023-06-29
  • C语言自定义类型详解(结构体、枚举、联合体和位段)
    目录前言一、结构体1、结构体类型的声明2、结构体的自引用3、结构体变量的定义和初始化4、结构体内存对齐5、结构体传参二、位段1、位段的定义 2、位段的内存分配3、位段的应用...
    99+
    2024-04-02
  • C语言数据结构之vector底层实现机制解析
    目录一、vector底层实现机制刨析二、vector的核心框架接口的模拟实现1.vector的迭代器实现2.reserve()扩容3.尾插尾删(push_back(),pop_bac...
    99+
    2024-04-02
  • C语言结构体字节对齐的实现深入分析
    目录前言一、什么是字节对齐二、结构体字节对齐三、#pragma pack()的使用总结前言 本教程可能会用到一点汇编的知识,看不懂没关系,知道是那个意思就行了。使用的工具是vs201...
    99+
    2022-11-13
    C语言结构体字节对齐 C语言字节对齐
  • C语言数据结构之堆、堆排序的分析及实现
    目录 1.堆的概念结构及分类1.2堆的分类1.2.1 大堆1.2.2 小堆2. 堆的主要接口3.堆的实现3.1 堆的初始化 HeapInit3.2 堆的销毁 HeapDes...
    99+
    2024-04-02
  • 怎么用C语言代码实现复数的加减及输出结构体
    这篇“怎么用C语言代码实现复数的加减及输出结构体”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用C语言代码实现复数的加减...
    99+
    2023-06-29
  • C语言详解如何实现堆及堆的结构与接口
    目录一、堆的结构及实现(重要)1.1 二叉树的顺序结构1.2 堆的概念及结构1.3 堆的实现1.3.1 堆的向下调整算法1.3.2 向下调整算法的时间复杂度1.3.3 堆的创建(向下...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作