C语言中的位段

        位段是通过结构体实现的,可以在一定程度上减小空间浪费,位段的声明和结构体类似,有以下几个不同:

①位段的成员必须是整形(int,char,short等)。

②成员后边有冒号和数字,表示该成员占几个bit位。

位段的内存分配

        我们知道结构体存在内存对齐的说法,会浪费一定的空间,那么位段的内存是怎么分配和使用的呢,位段的空间是按照需要以四个字节(int)一个字节(char)的方式开辟的,下面来举例说明一下:

struct A
{
//这里由于成员类型是int,所以一次要开辟四个字节,也就是32bit
    int a:2;
    int b:5;
//a和b占用7个bit,剩下25个bit不够c的,需要再开辟四个字节,所以总大小是8个字节
    int c:30;
}
struct S
{
//这里由于成员是char类型,先开辟一个字节,也就是8bit
    char a:3;
    char b:4;
//a和b用掉7bit,到c的时候还剩1bit,不够,需要再开辟一个字节,在vs编译器下,这里剩下的一个bit会浪费掉,c从新开辟的8bit中使用5bit
    char c:5;
//c用完后还剩3bit,不够d用,还需要再开辟一个字节,所以一共需要三个字节
    char d:4;
}
//如果c用掉第一个字节的最后一个bit,开辟新字节c只需要四个bit,剩下四个bit给d刚好,
//就可以少开辟一个字节,但是vs编译器就是会浪费掉用不完的字节,如果剩余字节不够,就从新开辟的字节开始使用

        了解了需要开辟多少空间,那么这些空间是怎么使用的呢:

        上图中开辟了三个字节的空间,可以看出每个字节都是从右往左开始使用,a占用了第一个字节的右边三位,b占用了第一个字节的中间四位,第一个字节的最左边一位浪费了,c占用了第二个字节的右边五位,第二个字节左边三位浪费,d占用了第三个字节的右边四位,第三个字节的左边四位浪费,a只有三位,无法存储1010,所以产生了截断,只存储了010。 

位段使用中的问题

        位段在使用中是存在一些隐患的:

①int位段被当成有符号数还是无符号数是不确定的,最好加上signed或unsigned。

②位段中最大位的数目不能确定(16位机器最大位数为16,32位机器最大位数为32),如果在16位机器中位的数目写的大于16会出问题。

③位段中的成员从左向右使用内存还是从右向左是不确定的(上面可以看出vs编译器是从右向左使用每个字节)。

④当前一个位段剩余位无法容纳下一个位段,开辟新空间后,后面的位段是舍弃剩余位还是使用剩余位,这一点也是不确定的(vs编译器是舍弃)。

        位段可以在满足结构体需求的前提下减小空间消耗,但是跨平台使用存在一些风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/656593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QA测试开发工程师面试题满分问答24: 用过哪些消息队列,各自的特点和优缺点是什么,结合项目实际说一说

回答思路 回答开头: 首先表达我对这个问题的认真态度,并表示我将根据自己的项目实践经验来回答。 列举使用过的消息队列: 根据我参与过的项目经验,我使用过以下几种主流的消息队列: RabbitMQApache KafkaRedis 的 pub/sub 功能 分别介绍各消息队列的特点: RabbitMQ: 特点: 基于…

Golang | Leetcode Golang题解之第104题二叉树的最大深度

题目: 题解: func maxDepth(root *TreeNode) int {if root nil {return 0}queue : []*TreeNode{}queue append(queue, root)ans : 0for len(queue) > 0 {sz : len(queue)for sz > 0 {node : queue[0]queue queue[1:]if node.Left ! nil {queue…

Matlab-熵权法

文章目录 熵权法一、模型简介二、例题1. 数据标准化2.指标的熵值和变异程度3.权重与评分4.代码实现 熵权法 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多…

大数据量上传FTP

背景 笔者有一个需求是把将近一亿条数据上传到FTP服务器中,这些数据目前是存储在mysql中,是通过关联几张表查询出来的,查询出来的数据结果集一共是6个字段。要求传输的时候拆分成一个个小文件,每个文件大小不能超过500M。我的测试…

迁移基于MicroBlaze处理器的设计

迁移基于MicroBlaze处理器的设计 生成系统基础设施(MicroBlaze、AXI_Interconnect, Clk_Wiz、Proc_Sys_Reset) 生成系统基础设施(MicroBlaze、AXI_Interconnect、Clk_Wiz和 Proc_Sys_Reset): 1.使用所需的板…

多级留言/评论的功能实现——Vue3前端篇

文章目录 思路分析封装组件父组件模板逻辑样式 子组件——二级留言模板逻辑样式 子组件——三级留言以上模板逻辑样式 留言组件的使用 写完论文了,来把评论的前端部分补一下。 前端的实现思路是自己摸索出来的,没找到可以符合自己需求的参考,…

大数据技术之Scala语言,只需一篇文章即可,教你学会什么是Scala,教你如何使用Scala

一丶Scala入门 1.1什么是Scala Scala是Scalable Language两个单词的缩写,表示可伸缩语言的意思。从计算机的角度来讲,Scala是一门完整的软件编程语言,那么连在一起就表示Scala是一门可伸缩的软件编程语言。之所以说它是可伸缩,是…

软件需求分析和软件原型开发是一会事情吗?

软件需求分析和软件原型开发是软件开发过程中的两个重要环节,它们各自承担着不同的任务,但又紧密相连,共同影响着软件项目的成功。下面将详细解释这两个环节的定义、目的以及它们之间的关系。 一、软件需求分析 定义:软件需求分析…

怎样把学浪上的视频保存到电脑

我已经将学浪视频下载工具打包好了,有需要的下载下来 学浪下载工具打包链接:百度网盘 请输入提取码 提取码:1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.打开解压后的压缩包里面的N_m3u8D文件夹&#…

20道经典自动化测试面试题

概述 觉得自动化测试很难? 是的,它确实不简单。但是学会它,工资高啊! 担心面试的时候被问到自动化测试? 嗯,你担心的没错!确实会被经常问到! 现在应聘软件测试工程师的岗位&…

AI图片生成软件怎么用?让你轻松完成创作

随着人工智能技术的不断发展,越来越多的AI应用进入我们的生活。使用AI图片生成软件来创作图片可以极大地简化创作过程,让设计师轻松实现各种艺术效果。那么AI图片生成软件怎么用? 1. 选择合适的AI图片生成软件 市场上有许多AI图片生成软件供选择&#x…

商品上线搜索服务

文章目录 1.引入检索页面1.确保search目录和list.html都成功引入2.修改list.html,增加命名空间3.后端编写接口 SearchController.java4.测试访问 2.带条件分页检索1.前端要求返回数据的格式2.构建vo,SearchResult.java3.SkuInfoService.java 购买用户根据…

RocketMQ学习(1) 快速入门

mq的一些前置知识和概念知识可以看这篇文章——SpringCloud入门(3) RabbitMQ,比如常见mq的对比等等,这篇文章不再赘述。 目录 RocketMQ概念、安装与配置docker配置 RocketMQ快速入门**同步消息消费模式 **异步消息*单向消息**延迟消息*顺序消息批量消息事…

通过提示工程将化学知识整合到大型语言模型中

在当今快速发展的人工智能领域,大型语言模型(LLMs)正成为科学研究的新兴工具。这些模型以其卓越的语言处理能力和零样本推理而闻名,为解决传统科学问题提供了全新的途径。然而,LLMs在特定科学领域的应用面临挑战&#…

力扣HOT100 - 1143. 最长公共子序列

解题思路&#xff1a; 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…

【算法】位运算算法——两整数之和

题解&#xff1a;两整数之和(位运算算法) 目录 1.题目2.位运算算法3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.位运算算法 这个题目难点就在于不能用、- 那什么能够代替加号呢&#xff1f; 既然数的层面不能用号&#xff0c;那二进制的角度去用号即可。 恰好&a…

JavaScript(ES6)入门

ES6 1、介绍 ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript 语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语言。…

AAAI2024 基于扩散模型 多类别 工业异常检测 DiAD

前言 本文分享一个基于扩散模型的多类别异常检测框架&#xff0c;用于检测工业场景的缺陷检测或异常检测。 设计SG语义引导网络&#xff0c;在重建过程中有效保持输入图像的语义信息&#xff0c;解决了LDM在多类别异常检测中的语义信息丢失问题。高效重建&#xff0c;通过在潜…

mysql实战——Mysql8.0高可用之双主+keepalived

一、介绍 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;两台Mysql数据库的数据保持完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库宕机…

Wpf 使用 Prism 实战开发Day27

首页汇总和数据动态显示 一.创建首页数据汇总数据接口 汇总&#xff1a;待办事项的总数已完成&#xff1a;待办事项里面有多少条完成的待办完成比例&#xff1a;已完成和汇总之间的比例备忘录&#xff1a;显示备忘录的总数待办事项&#xff1a;显示待办事项未完成的集合备忘录&…