计算结构体,位段,联合体(共用体)的大小

news2024/11/24 5:06:36

目录

 一、计算结构体的大小

1.1 结构体的计算并不是简单的类型加运算

1.2 内存对齐

1.2.1 内存对齐规则

1.2.2 图解内存对齐

二、计算位段的大小

2.1位段是什么 

2.2 位段的内存分配

 三、计算联合体的大小

3.1 什么是联合体

3.2 联合体的内存分配 

END.


 一、计算结构体的大小

1.1 结构体的计算并不是简单的类型加运算

大家可以先算一下这个结构体所占字节数是多少?

是不是按照类型直接相加存储呢?(char(1字节)+int(4字节)+char(1字节)=6)

这个结果是不是等于6呢?

 

为什么会等于12呢?

 

仅仅是将char b,和int i的位置互换了一下,就导致了结果的不同,这又是为什么呢?

 

这是因为,在创建结构体时存在内存对齐的这一规则,并不是我们所认为的简单的存储。

1.2 内存对齐

1.2.1 内存对齐规则

  • 第一个成员在与结构体变量偏移量为0的地址处
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 

        对齐数=编译器默认的一个对齐数与该成员大小的较小值(vs环境下默认对齐数=8)

  •  结构体总大小为最大对齐数的整数倍
  • 如果结构体中嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。

 如果只看概念,是比较难理解的,接下来举一些例子,帮助理解。

1.2.2 图解内存对齐

我们首先看一下刚才困扰我们的一个例子

为什么会是12.

 

 通过上面的学习是否能够解释换位置后,结构体大小变为8

 

 

 还有一种嵌套结构体的情况

 

 根据上面规则的最后一条是否能解释为什么是16?

 

二、计算位段的大小

2.1位段是什么 

位段和结构体非常相似

  • 它的成员必须是int,unsigned int ,signed int和char
  • 成员后边有一个冒号和一个数字

                         

冒号后边的数字代表的是,占几个bit位(二进制位)

int a: 2;

int 本来是需要4个字节32个bit位(二进制位)

int a :  2;就代表a成员只占2个bit位,他的取值就是 00(0),01(1),10(2),11(3).

int b : 5;就代表b成员只占5个bit位

2.2 位段的内存分配

我们可以看到,结构体创建需要,16个字节

位段只需要8个字节

接下来我们就探讨一下位段的大小为什么会是8个字节(2个整型)

 

存储规则

  • 位段成员可以是int,unsigned int或char
  • 位段开辟空间,是根据成员来决定的,如果成员是int就一次开辟4个字节,成员是char一次开辟1个字节
  • 位段是不跨平台的,因为其中有很多不确定因素,平台之间的规定是不一样的,本次在vs平台上

一个例子来说明

图解位段存储

内存中的16进制和我们换算的一致,所以也证实了我们的猜想在vs环境下是正确的

也确实只用了3个字节 

 

 三、计算联合体的大小

3.1 什么是联合体

联合体的关键字是union

大家可以看到下图中,创建的联合体成员的地址都是相同的

由此可以得出,他们共用的是同一块空间,所以联合体又被称为共用体。

联合体有一个特点:不能同时使用,因为他们使用的是同一块空间,给 a 赋值时会改变 i 的值,给 i 赋值会改变 a 的值。 

 

 

3.2 联合体的内存分配 

为什么会是4呢?

这是因为联合体要共用同一块空间,所以他要确保所有的成员在存放数据时都能存的下(开辟的空间足够大)

因此,联合体在开辟内存时会以最大内存变量的大小作为标准来开辟空间。

int 占用4个字节,char 占用1个字节,所以联合体要以4字节开辟空间大小

 

 还有另一种情况

 

如果按照上面的方法来计算,7个字节也就够了,但最终结果是8个字节

这是因为,内存对齐和结构体相同,联合体也进行了内存对齐。

最终大小是最大对齐数的整数倍,离7最近的4的整数倍为8

 

 如果对内存对齐数有疑问,可以返回到计算结构体的模块。

 



END.

Time is the soil of all the achievements in the world. Time gives the utopian pain and happiness to the creator.

时间是世界上的一切成就的土壤。时间给空想者痛苦,给创造者幸福。

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

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

相关文章

Consensus Algorithm -- Raft

The Raft Consensus Algorithm Go 实现:etcd/raft、dragonboat Rust 实现:TiKV C 实现 :nebula-graph-storage、 RethinkDB、logcabin 拜占庭将军问题 拜占庭将军问题(Byzantine failures),是由莱斯利兰…

绝绝子!这些技巧真方便

技巧一:快速切换窗口 如果你还在使用桌面底部“任务栏”切换软件窗口,不妨试试这个“快速切换窗口”快捷键,仅需按住【Alt】键不放,并连续点按【tab】键即可实现窗口的快速切换,果真只有亲自上手体验才知道有多香&…

NLP中的对话机器人——问答机器人的应用场景

引言 本文是七月在线《NLP中的对话机器人》的视频笔记,主要介绍FAQ问答型聊天机器人的实现。 讲得还不错,关键是只要1分钱 FAQ问答机器人 FAQ就是一些常见问题与回答,比如https://letsencrypt.org/docs/faq/。 但是我们要做的不是一问一答…

原生RedHat OpenStack搭建

文章目录OpenStack的搭建方式实验软件及镜像实验环境配置NTP节点初始化配置配置本地yum仓库上传镜像文件至NTP节点搭建基于http的网络yum源搭建NTP服务配置Controller控制节点和Compute计算节点初始化配置安装RedHat OpenStack安装部署OpenStack配置OVS桥接OpenStack的搭建方式…

大赛启幕:2023数字中国创新大赛启动发布会在福州召开

2023年1月10日,由数字中国建设峰会组委会主办,福建省数字办、福建省工信厅、福建省通信管理局、福州市政府、泉州市政府、三明市政府、龙岩市政府等共同承办的2023数字中国创新大赛在福建省福州市盛大启幕。 十二届全国政协副主席王钦敏发来书面致辞。中…

Windows 10随机性死机怎么办?

在诸多的电脑问题中,死机算是格外恼人。尤其是当你正在编辑文档,正在做图,正在玩游戏,电脑突然死机,万一再加上没保存…… 如果你在使用Win10系统的过程中遇到随机性死机的问题,赶紧看看这篇文章。 小编整…

LeetCode 113. 路径总和 II

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 113. 路径总和 II,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode …

简单通讯录的实现

这次我们来实现一个简单的通讯录 目录 1.基本框架及的实现 2.相关结构体的实现 3.通讯录的初始化 4.新建联系人 5.显示所有联系人信息 6.删除联系人 7.查找指定联系人 8.修改联系人信息 9.对联系人进行排序 10.完整代码 既然是通讯录,我们要实现以下内容 …

内存泄漏调优案列

案列背景 最近在做公司项目核心接口压测和稳定性压测时,各接口的成功率不足99.99%,通过分割压测之后发现,在压测A服务时,内存上升明显,且伴有频繁的fgc发生 jvm老年代内存使用率已经达到了100%且应用的fgc有5000次&am…

离散数学与组合数学-02二元关系上

文章目录离散数学与组合数学-02二元关系上2.1 序偶和笛卡尔积2.1.1 有序组的定义2.1.2 笛卡儿积笛卡儿积的性质2.2 关系的定义2.2.1 二元关系定义与案例2.2.2 二元关系的数学符号定义案例枚举二元关系2.2.3 定义域和值域2.2.4 二元关系概念的推广2.3 关系的表示2.3.1 集合表示法…

RS-485/RS-422收发器芯片DP3085 兼容替代MAX3085EESA

什么是RS-485 典型的串行通讯标准是RS232和RS485,它们定义了电压,阻抗等,但不对软件协议给予定义。RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义:正电平在2V~6V之间,表示一个逻辑状态&#xf…

【基于动态内存+文件操作】通讯录管理系统

前言 每一个项目文件的功能说明 打印基本菜单1.创建一个适合存放联系人信息的结构体和通讯录结构体2.初始化通讯录(加载上次的联系人,检查容量是否充足) 枚举常量内部内容 (1)增加联系人信息 (2)删除某个联系人信息 (3)查找联系人信息 …

CY5.5-Dextran Cy5.5菁染料标记葡聚糖

产品名称:荧光Cy5.5菁染料标记葡聚糖 英文名称:CY5.5-Dextran 外观状态:紫色粉末 质量:90% 荧光波长:684nm-710nm 溶解性Dextran葡聚糖(右旋糖酐Dextran),是一类具支链葡萄糖高聚物,…

系分 - 案例分析 - 需求分析(FAST分析)

个人总结,仅供参考,欢迎加好友一起讨论 文章目录案例分析 - 需求分析(FAST分析)FAST1 范围定义2 问题分析鱼骨图帕累托图制定系统改进目标3 需求分析定义需求PIECES方法4 逻辑设计5 决策分析6 物理设计和集成/构造和测试/安装和发…

考虑写出一个不抛异常的swap 函数

目录 一.标准库中的swap函数 二.针对于非模板类,设计全特化的std::swap() 三.针对模板类 四.合理使用using 五.swap成员函数不能抛出异常 六.swap函数总结 一.标准库中的swap函数 在C11中有move函数,它可以是一个左值变为右值,在许多场…

mybatis进阶

Mybatis的各种查询功能 MyBatis的各种查询功能: * 1、若查询出的数据只有一条 * a>可以通过实体类对象接收 * b>可以通过list集合接收 * c>可以通过map集合接收 * 结果:{password123456, sex男, id3, age23, email12345qq.com, usernameadmin} …

STM32 按键模块化

文章目录前言一、按键的原理图二、按键的GPIO配置总结前言 本篇文章将继续带大家学习模块化编程,今天主要给大家讲解按键的模块化。 一、按键的原理图 我们可以看到按键分别接到了板子的PE3和PE4引脚。 按键的具体原理这里我就不多讲了,大家可以看我之…

星光starfive2开发板的gpio使用

starfive2开发板是riscv平台不错的板子。 发展非常快。在starfive1的基础上有大量的改进和提升。 板子上的GPIO引脚定义是这样定义的:如下图所示 右侧6,8,10是调试用的串口,跟树莓派是一致的。 GPIO引脚的编号跟树莓派不一样。…

Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题

Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题 每博一文案 常言道:“不经一事,不懂一人”。 一个人值不值得交往,在关键时候才能看得清。看过这样的一个…

ESP32设备驱动-HMC5883L磁场传感器驱动

HMC5883L磁场传感器驱动 1、HMC5883L介绍 霍尼韦尔 HMC5883L 是一款表面贴装、多芯片模块,专为低场磁场传感而设计,具有数字接口,适用于低成本罗盘和磁力计等应用。 HMC5883L 包括我们先进的高分辨率 HMC118X 系列磁阻传感器和一个 ASIC,该 ASIC 包含放大、自动消磁带驱动…