C语言结构体——位段概念的讲解

2023-11-08

前言

        之前我对结构体内存分配的方式、对默认对齐数的指令修改做了详细的博客讲解,(C语言结构体详解 (2) 结构体内存对齐,默认对齐数,大家有兴趣的话可以去了解了解这方面的知识。

        

一. 什么是位段?

位段的声明和结构是类似的,有两个不同:

1.位段的成员必须是 int、unsigned int 或signed int 。

2.位段的成员名后边有一个冒号和一个数字,每个数字代表了各个成员变量在结构体中所占的内存大小,数字的单位是bit位。

struct D{
    int _a:2;
    int _b:5;
    int _c:10;
    int _d:30;
};

 

        如上图代码,struct D就是位段类型的结构体,请大家猜一下,这个结构体的大小又占多少字节?

        我们按照字面上的意思来判断,有四个整型变量,每个整型变量所对应的大小分别为2bit,5bit,10bit,30bit位,那么四个成员变量一共占47bit位空间。通过调试代码可知,答案为:

         

 struct D位段类型的结果为8字节,接下来,我就来给大家分析一下8字节是怎样算出来的。

解析:位段如何开辟?因为结构体中成员变量都是整型,所以位段每一次开辟空间时,都是4字节,4字节的开辟。

           a占2位,b占5位,c占10位,共占17bit位,位段刚开始开辟的内存空间有4字节,32bit位,剩下的空间为15bit位(32-17)。
        15bit位的空间并不能存放下成员d的30bit位,所以还得开辟一次4字节空间,所以结果为8字节。

        结论:在位段存储的过程中,第一次开辟的空间剩余的15Bit位被浪费掉,第二次开辟的空间里,浪费了剩下的2bit位。

          这就是使用位段类型的好处,若是没有位段,四个整型变量就会在结构体中开辟4*4=16字节(128bit位) 的空间,而使用了位段,四个整型变量可以控制内存空间,只占8字节(64bit位);有人会问了,47bit位,还得要8字节才能存放下。我们要理解:位段只能是在一定程度上节省了空间,它并不能绝对的节省空间,要知足常乐。位段可以严格的控制每个变量所占内存,极大的节省了空间的使用效率,让各变量都能完美明确的分工。

二.位段的内存分配

1.位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型

2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

举个例子:

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;

}

 

 

好了,以上就为位段的知识点了,大家觉得有用的话,点个一键三连吧 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言结构体——位段概念的讲解 的相关文章

  • PHP源码安装脚本

    bin bash Author Mr Wu PHP安装脚本 WARNING 如网速不好 需上传php 8 1 9 tar gz包 2023 3 2 22 55 55 定义变量 dep pack epel release make apr p
  • 全国城市房价分析(pandas)

    中国主要城市的房价可以从https www creprice cn rank index html获取 该网页中会显示上一个月的房价排行情况 先复制前10个城市的数据 然后使用pd read clipboard 读取 我们来分析一下该月的数

随机推荐

  • 28个python爬虫项目,看完这些你离爬虫高手就不远了

    互联网的数据爆炸式的增长 而利用 Python 爬虫我们可以获取大量有价值的数据 1 爬取数据 进行市场调研和商业分析 爬取知乎优质答案 筛选各话题下最优质的内容 抓取房产网站买卖信息 分析房价变化趋势 做不同区域的房价分析 爬取招聘网站职
  • 数据库事务的隔离等级

    数据库的事务隔离级别有4个 由低到高依次是Read uncommitted Read Committed Repeatable read Serializable 这四个级别可以逐个解决脏读 不可重复读 幻读等问题 Tables 脏读 不可
  • 5G房子将会进一步带来更多的就业机会

    此次微信和支付宝面向市场推出的刷脸支付的产品 在安全上做了极大的努力 通过数据层层加密 保障了商户的资金安全 同时也为消费者带来了全新的消费体验 减少了商户在高峰期人流量分流的问题 与传统的聚合二维码收银台形成了优势互补的作用 通过微信和支
  • 如何使用sort快速排序

    试题 算法提高 快速排序 提交此题 评测记录 资源限制时间限制 1 0s 内存限制 256 0MB问题描述 用递归来实现快速排序 quick sort 算法 快速排序算法的基本思路是 假设要对一个数组a进行排序 且a 0 x 首先对数组中的
  • Unity3d + UGUI 的多分辨率适配

    原文地址 http blog csdn net dingkun520wy article details 49471789 1 Canvas的属性配置 2 Canvas Scaler
  • Spark Streaming的流数据处理和分析

    一 Spark Streaming 1 Spark Streaming概述 1 1 实时数据处理的动机 以前所未有的速度创造数据 来自移动 网络 社交 物联网的指数数据增长 联网设备 2012年为9B 到2020年将达到50B 到2020年
  • 2023年Python面试题_Python基础_42道

    什么是 Python Python 是一种编程语言 它有对象 模块 线程 异常处理和自动内存管理 可以加入其他语言的对比 Python 是一种解释型语言 Python 在代码运行之前不需要解释 Python 是动态类型语言 在声明变量时 不
  • linux中mariadb数据库升级

    前言 在使用mariadb的数据库 mysql有同样的问题 过程中 发现老版本的数据库的一些问题 1 自增字段是在内存里的 数据库重启后就会丢失 新的自增字段是根据表中已有数据的最大值 1 数据表的如果没有记录 自增字段又从头开始了 2 数
  • Python入门自学进阶-Web框架——23、DjangoAdmin项目应用-定制页面

    一 单个菜单页面实现 类似DjangoAdmin中点击一个管理表打开的样子 以客户首页为例 这里cust index就是路由表中的name字段的值 即别名 对应的就是路由项中的cust html 即对应视图函数cust index 视图函数
  • CREATE TABLE 语句

    CREATE TABLE 语句用于创建数据库中的表 语法 CREATE TABLE table name column name1 data type size column name2 data type size column name
  • fwknop SPA服务端源码编译

    fwknop 源码编译 1 背景介绍 2 源码编译 2 1 源码获取 2 2 环境介绍 2 3 对git克隆下来的代码直接进行编译 2 4 挑选出C 部分的服务端进行编译 1 背景介绍 fwknop实现的是SPA Single Packet
  • 初识 flex & bison

    基本概念 flex 和 bison 经常结合使用 分别用于词法分析和语法分析 词法分析器 flex flex 用于生成词法分析器或者说是扫描器 scanner 它将输入的文本分解为称为 tokens 的序列 每个 token 都有一个特定的
  • VSCode下载慢问题

    进入VSCode官网根据自己的电脑选择相应的版本后下载 但是下载过程超级慢 有时候下载一半断开 让人有点崩溃 解决方法 改为国内镜像 打开谷歌浏览器下载内容 找到正下载的vscode 点击上图的链接 跳转到新的窗口 将其路径中的az7642
  • Vue 项目 使用 lang=“scss“ 已经有了 sass-loader 依赖 还是报错

    原因可能是 sass loader 版本太高的原因 安装7 3 1版本 即可解决问题 cnpm install sass loader 7 3 1 save dev
  • element中el-input组件限制输入条件(数字、特殊字符)

    1 只能输入纯数字
  • Spring MVC+Jquery Ajax 前后台传递Json对象

    关于Spring MVC3 X 接收和返回Json 最近开发项目时遇到此问题 解决后 特做下备忘 1 javabean 1 Content java public class Content implements Serializable
  • redis 安装

    一 Redis 介绍 二 Redis 下载 Redis下载官方下载地址 https redis io download 选择需要的版本 三 Redis 安装 将下载好的源文件上传到服务器 以下默认安装路径在 usr local目录下 使用最
  • 计算机应用在学科整合中的课题研究,多媒体计算机技术与学科教学的整合(课题研究阶段总结)...

    多媒体计算机技术与学科教学的整合 2014 12 2015 5 子长县职业教育中心 白勰 在承担课题研究任务以来 由于领导的高度重视 学校采取了切实可行的工作措施 同时也做了大量务实的工作 使课题研究能够顺利地推进 达到了预期效果 为了使课
  • CTP: 为什么报网络原因发送失败,但连接却成功?

    碰到一个很妖的问题 最后请教一位高手把问题定位到 md is logining ptr 0x7f0318027d80 init gt init lt get api version v6 5 1 20200908 10 25 08 get
  • C语言结构体——位段概念的讲解

    前言 之前我对结构体内存分配的方式 对默认对齐数的指令修改做了详细的博客讲解 C语言结构体详解 2 结构体内存对齐 默认对齐数 大家有兴趣的话可以去了解了解这方面的知识 一 什么是位段 位段的声明和结构是类似的 有两个不同 1 位段的成员必