C语言中的位段

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

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

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

位段的内存分配

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

struct A
{
//这里由于成员类型是int,所以一次要开辟四个字节,也就是32bitint a:2;int b:5;
//a和b占用7个bit,剩下25个bit不够c的,需要再开辟四个字节,所以总大小是8个字节int c:30;
}
struct S
{
//这里由于成员是char类型,先开辟一个字节,也就是8bitchar a:3;char b:4;
//a和b用掉7bit,到c的时候还剩1bit,不够,需要再开辟一个字节,在vs编译器下,这里剩下的一个bit会浪费掉,c从新开辟的8bit中使用5bitchar 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编译器是舍弃)。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode---栈与队列

232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int pee…

深入理解Java面向对象设计的六大原则

目录 单一职责原则(SRP) 开放封闭原则(OCP) 里氏替换原则(LSP) 依赖倒置原则(DIP) 接口隔离原则(ISP) 迪米特法则(LoD) 结语 …

Mac快速搭建前端环境创建前端项目【Vue】

Mac快速搭建前端环境&创建前端项目 官网: vue:https://cn.vuejs.org/vue-router:https://www.axios-http.cn/pinia:https://pinia.vuejs.org/zh/getting-started.htmlaxios:https://www.axios-http.cn/ant-design&…

Advanced Installer 问题集锦

1、界面在主题中显示的图标,如logo、发布者名称、产品名称就算在设计界面时删除,但是下次打开工程依然存在 解决办法:“可见”属性设置为禁用 2、在不关闭软件的情况下,使用"文件->打开"来切换项目,再次…

c++按索引同时删除多个元素

文章目录 代码结果 这个时候不能从前往后删&#xff0c;因为会破坏後面的元素的索引值&#xff0c;比如如果第删除了第2个元素&#xff0c;第3个元素的索引就会变为第2个元素的索引&#xff0c;造成混乱&#xff0c;甚至引起程序崩溃。应该从後往前删。 代码 #include<iost…

学习笔记——数据通信基础——数据通信网络(基本概念)

数据通信网络基本概念 网络通信&#xff1a;是指终端设备之间通过计算机网络进行的通信。 数据通信网络(Data Communication Network)&#xff1a;由 路由器、交换机、防火墙、无线控制器、无线接入点&#xff0c;以及个人电脑、网络打印机&#xff0c;服务器等设备构成的通信…

软考 系统架构设计师系列知识点之杂项集萃(21)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;20&#xff09; 第30题 软件结构化设计包括&#xff08; &#xff09;等任务。 A. 架构设计、数据设计、过程设计、原型设计 B. 架构设计、过程设计、程序设计、原型设计 C. 数据设计、过程设…

探秘GPT-4o:人工智能语言模型的新纪元

目录 前言1 GPT系列版本演变1.1 GPT-1到GPT-3的演变1.2 GPT-4的引入 2 GPT-4o与GPT-4的区别2.1 参数规模和架构优化2.2 训练数据和方法改进2.3 多模态能力 3 GPT-4o在语言生成和理解方面的技术能力3.1 更自然的语言生成3.2 更深刻的语境理解3.3 强大的跨语言能力3.4 自适应学习…

服务器硬件基础知识全面解析

在信息技术领域&#xff0c;服务器作为支撑各类业务运行的基石&#xff0c;其稳定性和性能至关重要。服务器硬件作为服务器的核心组成部分&#xff0c;直接决定了其处理能力、可靠性和扩展性。本文将深入浅出地介绍服务器硬件的基础知识&#xff0c;帮助IT专业人士及对服务器技…

git都在自己的个人分支开发吗?功能分支和个人分支工作流

在实际的开发过程中&#xff0c;使用分支的策略可以根据项目的需求和团队的工作流程进行调整。以下是两种常见的分支策略&#xff1a; 1. 功能分支&#xff08;Feature Branches&#xff09; 每个功能或修复一个独立的分支。这种方法通常被称为“功能分支工作流”。 优点 隔…

如何通过手机自学编程入门:探索四、五、六、七方面的学习路径

如何通过手机自学编程入门&#xff1a;探索四、五、六、七方面的学习路径 在信息爆炸的时代&#xff0c;手机已不仅仅是通讯工具&#xff0c;更是知识的宝库和学习的利器。对于渴望入门编程的初学者来说&#xff0c;手机自学编程成为了一种便捷而高效的选择。本文将围绕四个方…

【Unity Shader入门精要 第11章】让画面动起来(一)

1. Unity Shader中的时间变量 Shader控制这物体的显示&#xff0c;当向Shader中引入时间变量后&#xff0c;就可以让物体的显示效果随时间发生变化&#xff0c;以实现动画效果。 Unity中常见的时间变量如下表&#xff1a; 变量类型描述_Timefloat4(t/20, t, 2t, 3t)&#xf…

gulp入门5:registry

在 Gulp 的上下文中&#xff0c;registry 通常不直接指代一个常规用户需要使用的功能&#xff0c;因为它更多地与 Gulp 的内部任务注册和管理机制相关。然而&#xff0c;Gulp 允许通过其插件系统来扩展和自定义任务注册表的行为。以下是一个关于 Gulp 中 registry 的深入教程&a…

## 揭开疾病预测的神秘面纱:面向医疗专业人士的sklearn逻辑回归逐步指南

引言 在当今数据驱动的医疗保健领域&#xff0c;机器学习已成为从患者数据中提取见解并做出明智决策的强大工具。在众多机器学习算法中&#xff0c;逻辑回归以其简单性、可解释性和解决分类问题的有效性脱颖而出。在本综合指南中&#xff0c;我们将深入研究逻辑回归的世界&…

打造高可用系统:深入了解心跳检测机制

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的技术小伙伴小米,今天咱们来聊聊分布式系统中的“心跳检测”机制。心跳检测是一种简单而又重要的机制,用来监控系统的…

如何实现虚拟列表?定高和不定高两种场景

之前我写了一篇文章&#xff1a;如何使用 IntersectionObserver API 来实现数据的懒加载 在文章的最后&#xff0c;我们提到如果加载的列表数据越来越多&#xff0c;我们不可能把所有的数据都渲染出来&#xff0c;因为这样会导致页面卡住甚至崩溃。 为了优化这种长列表场景&am…

WebPack插件实现:打包之后自动混淆加密JS文件

在WebPack中调用JShaman&#xff0c;实现对编译打包生成的JS文件混淆加密 一、插件实现 1、插件JShamanObfuscatorPlugin.js&#xff0c;代码&#xff1a; class JShamanObfuscatorPlugin { apply(compiler) { compiler.hooks.emit.tapAsync(JShamanObfuscatorPlugin, (comp…

超级好用的C++实用库之跨平台实用方法

&#x1f4a1; 需要该C实用库源码的大佬们&#xff0c;可搜索微信公众号“希望睿智”。添加关注后&#xff0c;输入消息“超级好用的C实用库”&#xff0c;即可获得源码的下载链接。 概述 C跨平台开发时&#xff0c;我们经常会遇到一系列挑战和问题。这些问题主要源自不同操作…

Leetcode:两数之和

普通版本&#xff08;暴力枚举&#xff09; 题目链接&#xff1a;1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; //自己写的for循环 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> res;bool flag …

浙江大学数据结构MOOC-课后习题-第九讲-排序3 Insertion or Heap Sort

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 和上一题的思路一样&#xff0c;每进行一次迭代&#xff0c;来验证当前序列是否和给定的序列相同 代码展示 #include <cstdlib> #include <iostream> #define MAXSIZE 10…