C++中`union`
文章目录
- C++中的`union`
- 什么是`union`?
- 定义`union`
- 示例一
- 输出结果:
- 示例二
- 修正后的代码
- 解释
- 输出结果
- 结论
- `union`的特性
- 匿名`union`示例
- `union`和`struct`的区别
- 1. 内存布局
- 2. 同时访问
- 3. 用途
- `union`和`class`的区别
- 1. 数据成员
- 2. 功能性
- 3. 适用场景
在C++编程中,union是一种独特的数据结构,它允许不同类型的变量共用同一块内存空间。这一特性使得union在某些特定场景下非常有用,尤其是在内存受限或需要节省内存的嵌入式系统中。union的每个成员共享相同的内存地址,这意味着在任何时刻,union只能存储一个成员的值。尽管这种限制使得union的使用变得稍显复杂,但它同时提供了一种灵活而强大的工具,用于处理多种数据类型。
C++中的union
什么是union
?
union
(联合体)是一种特殊的数据结构,它允许你在同一个内存位置存储不同类型的数据。union
中的所有成员共用同一块内存区域,意味着一个union
变量的所有成员共享相同的内存地址。因此,union
中最多只能有一个成员变量有效。
定义union
定义union
的方式与结构体相似,语法如下:
union UnionName {MemberType1 member1;MemberType2 member2;// ...
};
示例一
#include <iostream>union Data {int i;float f;char c;
};int main() {Data data;data.i = 10;std::cout << "data.i: " << data.i << std::endl;data.f = 3.14;std::cout << "data.f: " << data.f << std::endl;std::cout << "data.i after setting data.f: " << data.i << std::endl; // 注意这一行data.c = 'A';std::cout << "data.c: " << data.c << std::endl;std::cout << "data.f after setting data.c: " << data.f << std::endl; // 注意这一行return 0;
}
输出结果:
data.i: 10
data.f: 3.14
data.i after setting data.f: 1078523331
data.c: A
data.f after setting data.c: 1.36424e-43
在这个例子中,由于union
中的所有成员共享相同的内存位置,所以在修改data.f
或data.c
后,data.i
的值被覆盖,输出值也会发生变化。
示例二
你的代码有许多语法错误和不完整的部分,我会修复并为你提供一个可编译的版本。以下是修正后的代码及其解释:
修正后的代码
#include <iostream>struct Vector2 {float x, y;
};struct Vector4 {union {struct {float x, y, z, w;};struct {Vector2 a, b;};};
};void PrintVector2(const Vector2& vector) {std::cout << vector.x << ", " << vector.y << std::endl;
}int main() {Vector4 vector = { 1.0f, 2.0f, 3.0f, 4.0f };PrintVector2(vector.a); // 输出: 1.0, 2.0PrintVector2(vector.b); // 输出: 3.0, 4.0vector.z = 500.0f; // 修改z的值为500.0fstd::cout << std::endl;PrintVector2(vector.a); // 输出: 1.0, 2.0PrintVector2(vector.b); // 输出: 500.0, 4.0std::cin.get();return 0;
}
解释
-
Vector2
结构体:定义了一个简单的结构体,包含两个浮点数x
和y
。 -
Vector4
结构体:Vector4
结构体包含一个联合体(union
),该联合体可以在相同的内存空间内存储不同的数据。- 联合体内有两个匿名结构体(匿名结构体是没有名字的结构体,可以直接访问其成员):
- 第一个结构体包含四个浮点数
x, y, z, w
。 - 第二个结构体包含两个
Vector2
类型的成员a
和b
。
- 第一个结构体包含四个浮点数
- 由于这些成员共享同一块内存,因此修改
z
会影响b
中的数据。
-
PrintVector2
函数:这是一个简单的打印函数,用于输出Vector2
的x
和y
值。 -
main
函数:- 初始化了一个
Vector4
对象vector
,并赋予x, y, z, w
初始值1.0f, 2.0f, 3.0f, 4.0f
。 - 然后通过
PrintVector2
函数分别打印vector.a
和vector.b
。 - 修改
z
的值为500.0f
后,重新打印vector.a
和vector.b
,可以看到修改z
后b
中的值也发生了变化。
- 初始化了一个
输出结果
1.0, 2.0
3.0, 4.01.0, 2.0
500.0, 4.0
结论
通过这种方式,我们可以在一个union
中存储不同的结构体,利用它们共享的内存,实现灵活的数据操作。这种技巧常用于内存受限的嵌入式系统中。
union
的特性
- 内存共享:
union
中的所有成员共用一块内存,union
的大小取决于其最大成员的大小。 - 一次只能保存一个值:虽然
union
可以有多个成员,但在任何给定时刻只能存储一个有效值,其他成员的值会被覆盖。 - 匿名
union
:如果不需要命名,可以使用匿名union
,它的成员可以直接访问,而不需要通过union
变量名。
匿名union
示例
#include <iostream>int main() {union {int i;float f;};i = 10;std::cout << "i: " << i << std::endl;f = 3.14;std::cout << "f: " << f << std::endl;std::cout << "i after setting f: " << i << std::endl;return 0;
}
union
和struct
的区别
1. 内存布局
struct
:每个成员都有自己的内存空间,结构体的大小是所有成员大小的总和加上可能的对齐填充。union
:所有成员共用同一块内存,union
的大小是最大成员的大小。
2. 同时访问
struct
:可以同时访问所有成员,因为每个成员占用不同的内存区域。union
:只能访问一个成员,访问其他成员时,结果是未定义的。
3. 用途
struct
:用于组合不同类型的变量,以便能够同时存储和访问这些变量。union
:用于节省内存,特别是在你知道同一时刻只需要存储其中一个变量的情况下。
union
和class
的区别
1. 数据成员
class
:默认情况下,其成员的访问权限是private
,类可以包含成员函数和构造函数、析构函数。union
:所有成员默认是public
的。union
可以包含构造函数和析构函数,但只能有一个活跃的成员。
2. 功能性
class
:具有更丰富的功能性,可以封装数据和行为,支持继承和多态等特性。union
:功能较为有限,主要用于节省内存,没有继承和多态等高级特性。
3. 适用场景
class
:用于创建复杂的数据类型,封装数据和行为,适用于面向对象编程。union
:主要用于节省内存空间,适用于内存管理要求严格的场景。
通过这些对比,可以看出union
与struct
、class
在内存管理和使用场景上的区别。union
适合用于需要节省内存且同一时刻只需要存储一种数据的情况,而struct
和class
更适合需要同时存储并访问多种数据的情况。
相关文章:
C++中`union`
文章目录 C中的union什么是union?定义union示例一输出结果: 示例二修正后的代码解释输出结果结论 union的特性匿名union示例 union和struct的区别1. 内存布局2. 同时访问3. 用途 union和class的区别1. 数据成员2. 功能性3. 适用场景 在C编程中࿰…...
Linux——网络(1)
一、IPC(进程间通信方式) IPC:Inter Process Communication 共享内存(最高效的进程间通信方式) 虚拟地址 mmu(memory management unit ) 共享内存: 1.是一块,内核预留的空间 2.最高效的…...
【五】阿伟开始学Kafka
阿伟开始学Kafka 概述 人生若只如初见,阿伟心里回想起了第一次和Kafka见面的场景,记忆虽然已经有些模糊,但是感觉初次见面是美好的。积累了一些实战经验之后,阿伟感觉不能再是面对百度开发了,于是决心系统的学习一下Ka…...
Java—Arrays api
public static String toString(数组) //把数组拼接成一个字符串 public static int binarySearch(数组,查找的元素) //二分查找法查找元素 public static int[] copyOf(原数组,新数组长度) //拷贝数组 public st…...
Java - 基数排序算法介绍、应用场景和示例代码
概述 基数排序(Radix Sort)是一种非比较型整数排序算法,适用于整数或固定长度的字符串排序。它的基本思想是将待排序的元素分为多个关键字进行排序,通常从最低位(最低有效位,Least Significant Digit, LSD…...
Django 后端架构开发:文件云存储,从本地存储到腾讯COS桶集成
⭐ Django 后端架构开发:文件云存储,从本地存储到腾讯COS桶集成 目录 ☁️ 文件云存储 - 项目使用云存储💻 文件云存储 - 项目中使用本地存储📝 文件云存储 - 概述和创建项目🌐 腾讯COS桶 - 概述📚 腾讯CO…...
【系统分析师】-综合知识-计算机网络与信息安全
1、要对消息明文进行加密传送,当前通常使用的加密算法是 报文认证算法:数字摘要 RSA 非对称加密,一般不用于明文 MD5 数字摘要 SHA-1 数字摘要,160位的消息摘要 HMAC 以一个密钥和一个消息为输入,生成一个消息摘要作…...
C++ | Leetcode C++题解之第363题矩形区域不超过K的最大数值和
题目: 题解: class Solution { public:int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {int ans INT_MIN;int m matrix.size(), n matrix[0].size();for (int i 0; i < m; i) { // 枚举上边界vector<int> sum(…...
python动画:场景的线性变换展示
一,主函数 LinearTransformationScene 是 Manim 中用于展示线性变换的场景类。它通过在一幅背景和前景平面上展示向量和变换,帮助理解线性代数中的概念。 LinearTransformationScene(include_background_planeTrue, include_foreground_planeTrue, ba…...
HBase体系架构与环境搭建
这里写目录标题 一、常见的NoSQL数据库二、HBase的体系架构和表结构三、搭建HBasa环境1.本地模式2.伪分布模式全分布模式HA模式 一、常见的NoSQL数据库 NoSQL数据库的说明与定义 NoSQL是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称。它…...
海思SD3403/SS928V100开发(16)Tsensor驱动开发
1. 前言 由于需要检测SD3403芯片内部实时温度,需要开发Tsensor传感器驱动和应用 查看手册发现SD3403内部有三个Tsensor传感器 可以参考之前我写的35系列平台Tsensor驱动开发记录 海思35系列平台Tsensor驱动开发(1)驱动编写_t sensor-CSDN博客 海思35系列平台Tsensor驱动…...
JVM类加载机制—JVM类加载过程
一、概述 代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验、转换解析、初始化,使这些数据最终成…...
可变参数模板与包装器
抱歉:铁汁们,最近在做兼职,积累社会经验,多有拖欠,请多多包涵(抱拳) 引子:接上回我们讲了C11的几种新增,今天就来接着讲C11中比较有用的二个东西可变参数模板与包装器。…...
工业控制常用“对象“数据类型汇总(数据结构篇)
合理巧妙的数据结构会大大简化项目的编程工作量,所以任何项目前期第一步应该是设计巧妙的数据结构、封装对象属性。这样会使我们的编程快捷和高效。这篇博客作为数据类型汇总,会不间断更新。 1、普通电机轴对象 2、普通电机轴对象(详细结构变量) TYPE "udtMotorAxis&q…...
优雅处理枚举前端丢失大Long精度问题
1. 枚举-json处理(前端 <> 后端 <> 数据库) 前端传递 枚举code 后端响应 枚举code 表里存储 枚举code 内存处理 枚举对象 Getter AllArgsConstructor JsonFormat(shape JsonFormat.Shape.OBJECT) public enum SexEnum {MALE(0, "男&…...
【c/c++】 学习ector 容器笔记
c/c 学习ector 容器笔记 int 型的 vector 容器应该使用什么类型的索引? 对于 int 型的 vector 容器,应该使用 size_t 类型的索引。size_t 是一个无符号整数类型,它在标准库中广泛用于表示大小和索引。它足够大,可以表示任何标准…...
DN专业3D图形制作软件win/mac软件安装下载(附下载链接)
目录 一、软件概述 1.1 Adobe DN简介 1.2 Windows/Mac系统要求 Windows系统: Mac系统: 二、安装步骤 2.1 下载与解压 2.2 安装程序 2.3 启动软件 三、使用教程 3.1 界面介绍 3.2 创建和编辑3D内容 3.3 合成与渲染 四、高级技巧与注意事项 …...
VSCode搭建Hzero(SpringCloud架构)后端开发调试环境
正常情况下我们使用IDEA开发Hzero,但是有的公司是不允许破解或者使用IDEA的,此时可以使用eclipse来替代也是可以的,最近尝试使用VSCode来开发调试发现了一些问题其中最大的问题是Vscdoe在绝大多数情况下是不能直接运行Hzero,使用插…...
【C++】OJ习题(初阶)
🚀个人主页:奋斗的小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 💥1、字符串💥1.1 字符串相加💥1.2 验证回文字符串💥1.3 反转…...
6.4K+ Star!一个强大的本地知识库问答系统,支持多格式文件和跨语言检索,为企业提供高效、安全的数据洞察……
https://github.com/netease-youdao/QAnything 【阅读原文】跳转Github项目 转自AIGC创想者 项目简介 QAnything 是一个基于本地知识库的问答系统,它能够理解和回答基于任何类型文件的问题。 QAnything支持的文件格式非常广泛,包括PDF、Word、PPT、XL…...
mvn编译的时候出现Perhaps you are running on a JRE rather than a JDK 解决方法
目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 mvn编译的时候出现如下问题: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile (default-compile) on project yudao...
React原理之Fiber详解
前置文章: React原理之 React 整体架构解读React原理之整体渲染流程 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 😊----- 在React原理之 React 整体架构解读中,简单介绍了 Fiber 架构,也了解了 Fiber 节点的…...
远离“优越感”陷阱,拥抱美好人生
在人生的漫长旅程中,我们不断地与他人相遇、相知、相交,在各种关系中寻找温暖、支持与成长。然而,并非所有的关系都如我们所愿,有些关系甚至可能成为我们前进道路上的阻碍。正如我们所知,唯利是图者不可交,但有一种关系比索要金钱更值得警惕,那就是找你索取满足感的关系…...
Redis的线程模型
Redis作为一种基于内存的高性能键值对数据库,其线程模型和IO模型是实现高性能的关键因素。以下将详细探讨Redis的线程与IO模型,内容不少于2000字。 一、Redis的线程模型 Redis的线程模型是理解其高性能的重要基础。在Redis的发展过程中,其线…...
ubuntu24.04安装nginx1.24
ubuntu安装nginx 更新包索引 sudo apt update安装nginx sudo apt install nginx确认安装成功并检查Nginx版本 nginx -v启动Nginx服务 sudo systemctl start nginx设置Nginx开机自启 sudo systemctl enable nginx在浏览器中访问 http://<your_server_IP> 来确认Nginx…...
一款好看的WordPress REST API 主题
介绍: 主题特色: 使用Nuxtjs WordPress Rest Api 实现前后端分离,可完成多端部署; 主题支持自动切换黑夜模式。 使用说明: service 目录为wordpress主题文件,需要拷贝到wordpress主题目录下࿰…...
《5G 与区块链融合:智能城市服务质量的飞跃》
在科技飞速发展的时代,5G 技术的普及正以前所未有的速度改变着我们的生活,而区块链技术的兴起也为各领域带来了创新的解决方案。当这两种前沿技术相互结合,将为智能城市的发展注入强大动力,显著提升服务质量,开创更加便…...
前后端分离开发:用 Apifox 高效管理 API
目录 1.前后台分离开发介绍 2.API 2.1 APIfox介绍 2.2 接口文档管理 1.前后台分离开发介绍 前端开发有2种方式:「前后台混合开发」和「前后台分离开发」。 前后台混合开发,顾名思义就是前台后台代码混在一起开发,如下图所示:…...
Go Channel 详解
概述 在 Go 语言中,channel 是一种用于在 goroutine 之间传递数据的机制。它提供了同步和通信的能力,使得并发编程变得更加简单和安全。Channel 在 Go 语言中的设计是类型安全的,并且支持发送和接收两种操作。 基本概念 创建通道 创建一个…...
使用FModel提取游戏资产
使用FModel提取游戏模型 前言FModel简介FModel安装FModel使用初次使用资产预览资产导出 附录dumperDumper-7生成usmap文件向游戏中注入dll 前言 这篇文章仅记录我作为初学者使用FModel工具提取某款游戏模型的过程。 FModel简介 FModel是一个开源软件,可以用于查看…...
网站建设价格/青岛网络优化哪家专业
搬到了gipsyh.icu...
百度网站推广费用/18款免费软件app下载
Copy to Clipboard引用的内容:[www.veryhuo.com]class fancyCache{private static $_instance NULL;protected $_options array();/*** 初始化构造函数* $cacheDir : 缓存文件目录* $expire : 缓存文件有效期,单位为秒* $file_ext : 缓存文件后缀*/publ…...
昆明凡科建站多少钱/电商营销策略
术语定义 术语英文解释哈希算法hash algorithm是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。哈希表hash table根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作…...
安卓android下载安装/seo网站外包公司
题目大意:三种操作: $Name\;Socore:$上传最新得分记录,把以前的记录删除。$?Name:$ 查询玩家排名。如果两个玩家的得分相同,则先得到该得分的玩家排在前面。$?Index:$ 返回自第$Index$名开始的…...
做网站调用无广告视频/seo建站技巧
蒸汽流量计采用先进的差动技术,配合隔离、屏蔽、滤波等措施,克服了同类产品抗震性差、小信号数据紊乱等问题,并采用了独特的传感器封装技术和防护措施,保证了产品的可靠性。产品有基本型和复合型两种型式,基本型测量单…...
哈尔滨做网站费用报价/百度云盘登录入口
1.11〓系统调用和库函数 所有操作系统都提供多种服务的入口点,由此程序向系统核请求服务。各种版本的Unix都 提供经良好定义的有限数目的入口点,经过这些入口点进入系统核,这些入口点被称之为 系统调用(system call),系统调用是我…...