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…

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、在不关闭软件的情况下,使用"文件->打开"来切换项目,再次…

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

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

探秘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 自适应学习…

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

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

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

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

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

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

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

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

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

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

【PHP小课堂】PHP中的网络组件相关函数

PHP中的网络组件相关函数 作为一门以 WEB 开发为主战场的编程语言来说&#xff0c;PHP 即使是在目前这个大环境下&#xff0c;依然也是 WEB 领域的头号玩家。我们在网络相关的功能中也提供了许多方便好用的函数组件&#xff0c;而且它们都是不需要安装扩展就能够使用的。今天&a…

ubuntu-24.04系统静态Mac和IP配置

操作系统版本&#xff08;桌面版&#xff09;&#xff1a;ubuntu-24.04-desktop-amd64.iso 原因说明&#xff1a;因网络的IP地址和Mac是预分配的&#xff0c;所以ubuntu系统需要修改网卡的mac地址和IP才能访问&#xff0c;网络查了半天资料都没成功&#xff0c;后再界面提示&a…

网上书城|基于SprinBoot+vue的网上书城管理系统(源码+数据库+文档)

网上书城管理系统 目录 基于SprinBootvue的网上书城管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

NGINX完全指南_实现高性能负载均衡的进阶实操指南

欢迎阅读 2024 版《NGINX 完全指南》。OReilly 已连续九年出版《NGINX 完全指南》&#xff0c;我们不断进行更新以跟上 NGINX 做出的诸多改进。如今&#xff0c;NGINX 是全球最受欢迎的 Web 服务器。该产品于 2004 年首次发布&#xff0c;并不断发展&#xff0c;以满足现代应用…

【进阶篇】Midjourney如何最大限度精准控图,做到收放自如?

和朋友们一起玩MJ也已经快两个月了&#xff0c;从一开始的惊喜&#xff0c;到现在的平淡&#xff0c;大家都开始思考这个到底我们应该怎么用&#xff1f;而不是仅仅是为了满足自己对MJ本身的好奇心&#xff0c;以及生出一张美图时的那种喜悦感。 目前大家最多的疑问就是&#…

matlab生成波形然后采样,FPGA写testbench读取数据

一、在matlab产生激励 fs1000; % 这个是路数 M16; % 这个是FFT的点数&#xff0c;64K L65536; % 将N写为两个整数乘积的形式&#xff0c;即N ML&#xff0c;(log2 M和log2 L都为正整数) NM*L; % 这段 MATLAB 代码是用来生成一个时间序列的&#xff0c; % 该时间序列从0开…

搜索自动补全-elasticsearch实现

1. elasticsearch准备 1.1 拼音分词器 github地址&#xff1a;https://github.com/infinilabs/analysis-pinyin/releases?page6 必须与elasticsearch的版本相同 第四步&#xff0c;重启es docker restart es1.2 定义索引库 PUT /app_info_article {"settings": …

【机器学习】Pandas中to_pickle()函数的介绍与机器学习中的应用

【机器学习】Pandas中to_pickle()函数的介绍和机器学习中的应用 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#…

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training &#xff08;无NMS训练的一致性双重任务分配&#xff09;Holistic Efficiency-Accuracy Driven Model Design &#xff08;效率-精度驱动的整体模型设计&#xff09; …

STM32F4_HAL_LWIP_RAM接口UDP实验

目录 RAW 的 UDP 接口简介 RAW 的 UDP 实验 硬件设计 例程功能 软件设计 UDP 配置步骤 软件设计流程图 RAW 的 UDP 接口简介 UDP 协议的 RAW 的 API 功能函数&#xff0c;我们使用这些函数来完成 UDP 的数据发送和接收功能。 (1) udp_new 函数 此函数用来创建一个 UDP …