当前位置: 首页 > news >正文

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.fdata.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;
}

解释

  1. Vector2结构体:定义了一个简单的结构体,包含两个浮点数xy

  2. Vector4结构体

    • Vector4结构体包含一个联合体(union),该联合体可以在相同的内存空间内存储不同的数据。
    • 联合体内有两个匿名结构体(匿名结构体是没有名字的结构体,可以直接访问其成员):
      • 第一个结构体包含四个浮点数x, y, z, w
      • 第二个结构体包含两个Vector2类型的成员ab
    • 由于这些成员共享同一块内存,因此修改z会影响b中的数据。
  3. PrintVector2函数:这是一个简单的打印函数,用于输出Vector2xy值。

  4. main函数

    • 初始化了一个Vector4对象vector,并赋予x, y, z, w初始值1.0f, 2.0f, 3.0f, 4.0f
    • 然后通过PrintVector2函数分别打印vector.avector.b
    • 修改z的值为500.0f后,重新打印vector.avector.b,可以看到修改zb中的值也发生了变化。

输出结果

1.0, 2.0
3.0, 4.01.0, 2.0
500.0, 4.0

结论

通过这种方式,我们可以在一个union中存储不同的结构体,利用它们共享的内存,实现灵活的数据操作。这种技巧常用于内存受限的嵌入式系统中。

union的特性

  1. 内存共享union中的所有成员共用一块内存,union的大小取决于其最大成员的大小。
  2. 一次只能保存一个值:虽然union可以有多个成员,但在任何给定时刻只能存储一个有效值,其他成员的值会被覆盖。
  3. 匿名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;
}

unionstruct的区别

1. 内存布局

  • struct:每个成员都有自己的内存空间,结构体的大小是所有成员大小的总和加上可能的对齐填充。
  • union:所有成员共用同一块内存,union的大小是最大成员的大小。

2. 同时访问

  • struct:可以同时访问所有成员,因为每个成员占用不同的内存区域。
  • union:只能访问一个成员,访问其他成员时,结果是未定义的。

3. 用途

  • struct:用于组合不同类型的变量,以便能够同时存储和访问这些变量。
  • union:用于节省内存,特别是在你知道同一时刻只需要存储其中一个变量的情况下。

unionclass的区别

1. 数据成员

  • class:默认情况下,其成员的访问权限是private,类可以包含成员函数和构造函数、析构函数。
  • union:所有成员默认是public的。union可以包含构造函数和析构函数,但只能有一个活跃的成员。

2. 功能性

  • class:具有更丰富的功能性,可以封装数据和行为,支持继承和多态等特性。
  • union:功能较为有限,主要用于节省内存,没有继承和多态等高级特性。

3. 适用场景

  • class:用于创建复杂的数据类型,封装数据和行为,适用于面向对象编程。
  • union:主要用于节省内存空间,适用于内存管理要求严格的场景。

通过这些对比,可以看出unionstructclass在内存管理和使用场景上的区别。union适合用于需要节省内存且同一时刻只需要存储一种数据的情况,而structclass更适合需要同时存储并访问多种数据的情况。

相关文章:

C++中`union`

文章目录 C中的union什么是union&#xff1f;定义union示例一输出结果&#xff1a; 示例二修正后的代码解释输出结果结论 union的特性匿名union示例 union和struct的区别1. 内存布局2. 同时访问3. 用途 union和class的区别1. 数据成员2. 功能性3. 适用场景 在C编程中&#xff0…...

Linux——网络(1)

一、IPC&#xff08;进程间通信方式&#xff09; IPC&#xff1a;Inter Process Communication 共享内存&#xff08;最高效的进程间通信方式&#xff09; 虚拟地址 mmu(memory management unit ) 共享内存: 1.是一块&#xff0c;内核预留的空间 2.最高效的…...

【五】阿伟开始学Kafka

阿伟开始学Kafka 概述 人生若只如初见&#xff0c;阿伟心里回想起了第一次和Kafka见面的场景&#xff0c;记忆虽然已经有些模糊&#xff0c;但是感觉初次见面是美好的。积累了一些实战经验之后&#xff0c;阿伟感觉不能再是面对百度开发了&#xff0c;于是决心系统的学习一下Ka…...

Java—Arrays api

public static String toString(数组) //把数组拼接成一个字符串 public static int binarySearch(数组&#xff0c;查找的元素) //二分查找法查找元素 public static int[] copyOf(原数组,新数组长度) //拷贝数组 public st…...

Java - 基数排序算法介绍、应用场景和示例代码

概述 基数排序&#xff08;Radix Sort&#xff09;是一种非比较型整数排序算法&#xff0c;适用于整数或固定长度的字符串排序。它的基本思想是将待排序的元素分为多个关键字进行排序&#xff0c;通常从最低位&#xff08;最低有效位&#xff0c;Least Significant Digit, LSD…...

Django 后端架构开发:文件云存储,从本地存储到腾讯COS桶集成

⭐ Django 后端架构开发&#xff1a;文件云存储&#xff0c;从本地存储到腾讯COS桶集成 目录 ☁️ 文件云存储 - 项目使用云存储&#x1f4bb; 文件云存储 - 项目中使用本地存储&#x1f4dd; 文件云存储 - 概述和创建项目&#x1f310; 腾讯COS桶 - 概述&#x1f4da; 腾讯CO…...

【系统分析师】-综合知识-计算机网络与信息安全

1、要对消息明文进行加密传送&#xff0c;当前通常使用的加密算法是 报文认证算法&#xff1a;数字摘要 RSA 非对称加密&#xff0c;一般不用于明文 MD5 数字摘要 SHA-1 数字摘要&#xff0c;160位的消息摘要 HMAC 以一个密钥和一个消息为输入&#xff0c;生成一个消息摘要作…...

C++ | Leetcode C++题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; 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动画:场景的线性变换展示

一&#xff0c;主函数 LinearTransformationScene 是 Manim 中用于展示线性变换的场景类。它通过在一幅背景和前景平面上展示向量和变换&#xff0c;帮助理解线性代数中的概念。 LinearTransformationScene(include_background_planeTrue, include_foreground_planeTrue, ba…...

HBase体系架构与环境搭建

这里写目录标题 一、常见的NoSQL数据库二、HBase的体系架构和表结构三、搭建HBasa环境1.本地模式2.伪分布模式全分布模式HA模式 一、常见的NoSQL数据库 NoSQL数据库的说明与定义 NoSQL是一种不同于关系数据库的数据库管理系统设计方式&#xff0c;是对非关系型数据库的统称。它…...

海思SD3403/SS928V100开发(16)Tsensor驱动开发

1. 前言 由于需要检测SD3403芯片内部实时温度,需要开发Tsensor传感器驱动和应用 查看手册发现SD3403内部有三个Tsensor传感器 可以参考之前我写的35系列平台Tsensor驱动开发记录 海思35系列平台Tsensor驱动开发(1)驱动编写_t sensor-CSDN博客 海思35系列平台Tsensor驱动…...

JVM类加载机制—JVM类加载过程

一、概述 代码编译后&#xff0c;就会生成JVM&#xff08;Java虚拟机&#xff09;能够识别的二进制字节流文件&#xff08;*.class&#xff09;。而JVM把Class文件中的类描述数据从文件加载到内存&#xff0c;并对数据进行校验、转换解析、初始化&#xff0c;使这些数据最终成…...

可变参数模板与包装器

抱歉&#xff1a;铁汁们&#xff0c;最近在做兼职&#xff0c;积累社会经验&#xff0c;多有拖欠&#xff0c;请多多包涵&#xff08;抱拳&#xff09; 引子&#xff1a;接上回我们讲了C11的几种新增&#xff0c;今天就来接着讲C11中比较有用的二个东西可变参数模板与包装器。…...

工业控制常用“对象“数据类型汇总(数据结构篇)

合理巧妙的数据结构会大大简化项目的编程工作量,所以任何项目前期第一步应该是设计巧妙的数据结构、封装对象属性。这样会使我们的编程快捷和高效。这篇博客作为数据类型汇总,会不间断更新。 1、普通电机轴对象 2、普通电机轴对象(详细结构变量) TYPE "udtMotorAxis&q…...

优雅处理枚举前端丢失大Long精度问题

1. 枚举-json处理&#xff08;前端 <> 后端 <> 数据库&#xff09; 前端传递 枚举code 后端响应 枚举code 表里存储 枚举code 内存处理 枚举对象 Getter AllArgsConstructor JsonFormat(shape JsonFormat.Shape.OBJECT) public enum SexEnum {MALE(0, "男&…...

【c/c++】 学习ector 容器笔记

c/c 学习ector 容器笔记 int 型的 vector 容器应该使用什么类型的索引&#xff1f; 对于 int 型的 vector 容器&#xff0c;应该使用 size_t 类型的索引。size_t 是一个无符号整数类型&#xff0c;它在标准库中广泛用于表示大小和索引。它足够大&#xff0c;可以表示任何标准…...

DN专业3D图形制作软件win/mac软件安装下载(附下载链接)

目录 一、软件概述 1.1 Adobe DN简介 1.2 Windows/Mac系统要求 Windows系统&#xff1a; Mac系统&#xff1a; 二、安装步骤 2.1 下载与解压 2.2 安装程序 2.3 启动软件 三、使用教程 3.1 界面介绍 3.2 创建和编辑3D内容 3.3 合成与渲染 四、高级技巧与注意事项 …...

VSCode搭建Hzero(SpringCloud架构)后端开发调试环境

正常情况下我们使用IDEA开发Hzero&#xff0c;但是有的公司是不允许破解或者使用IDEA的&#xff0c;此时可以使用eclipse来替代也是可以的&#xff0c;最近尝试使用VSCode来开发调试发现了一些问题其中最大的问题是Vscdoe在绝大多数情况下是不能直接运行Hzero&#xff0c;使用插…...

【C++】OJ习题(初阶)

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、字符串&#x1f4a5;1.1 字符串相加&#x1f4a5;1.2 验证回文字符串&#x1f4a5;1.3 反转…...

6.4K+ Star!一个强大的本地知识库问答系统,支持多格式文件和跨语言检索,为企业提供高效、安全的数据洞察……

https://github.com/netease-youdao/QAnything 【阅读原文】跳转Github项目 转自AIGC创想者 项目简介 QAnything 是一个基于本地知识库的问答系统&#xff0c;它能够理解和回答基于任何类型文件的问题。 QAnything支持的文件格式非常广泛&#xff0c;包括PDF、Word、PPT、XL…...

VScode 高效开发 Springboot 应用的完整指南

1. 环境准备与项目创建 第一次用VScode开发Springboot项目时&#xff0c;我对着空白编辑器发呆了半小时。后来发现只要装对插件&#xff0c;效率能翻倍。先打开VScode的扩展商店&#xff0c;这三个插件是必装的&#xff1a; Java Extension Pack&#xff1a;包含语言支持、调…...

OpenClaw备份方案:GLM-4.7-Flash自动化任务容灾保护

OpenClaw备份方案&#xff1a;GLM-4.7-Flash自动化任务容灾保护 1. 为什么需要备份OpenClaw自动化任务 去年冬天&#xff0c;我的硬盘突然崩溃&#xff0c;导致辛苦配置的OpenClaw自动化任务全部丢失。那一刻我才意识到&#xff0c;当AI助手成为日常工作的"数字员工&quo…...

告别手动复制!用ArcGIS字段计算器(VB/Python)批量提取字段值的保姆级教程

ArcGIS字段计算器实战指南&#xff1a;VB与Python高效提取字段值的深度对比 在GIS数据处理工作中&#xff0c;属性表字段值的部分提取是最常见却又最耗时的操作之一。想象一下&#xff0c;当你面对一个包含上万条记录的"BSM"字段&#xff0c;需要提取前6位作为行政区…...

AutoGen多智能体框架实战指南:从环境搭建到业务落地

AutoGen多智能体框架实战指南&#xff1a;从环境搭建到业务落地 【免费下载链接】autogen 启用下一代大型语言模型应用 项目地址: https://gitcode.com/GitHub_Trending/au/autogen 在人工智能快速发展的今天&#xff0c;构建能够模拟人类协作模式的智能系统已成为技术突…...

用DolphinScheduler实现数仓自动化:从零搭建ETL工作流实战

用DolphinScheduler构建电商数仓ETL流水线&#xff1a;实战设计与优化指南 电商平台每天产生的TB级订单数据&#xff0c;如何转化为精准的用户画像和实时销售报表&#xff1f;本文将带你从零搭建一个基于DolphinScheduler的自动化数据处理流水线&#xff0c;解决实际业务场景中…...

SDMatte企业级应用:批量商品图去背景+Alpha Matte交付方案

SDMatte企业级应用&#xff1a;批量商品图去背景Alpha Matte交付方案 1. 产品概述 SDMatte是一款专为商业场景设计的高精度AI抠图工具&#xff0c;特别适合电商、广告和设计行业的大规模图像处理需求。它能快速将商品图片中的主体与背景分离&#xff0c;生成带有Alpha通道的透…...

流程可视化引擎定制指南:从技术实现到业务价值转化

流程可视化引擎定制指南&#xff1a;从技术实现到业务价值转化 【免费下载链接】Drawflow Simple flow library &#x1f5a5;️&#x1f5b1;️ 项目地址: https://gitcode.com/gh_mirrors/dr/Drawflow 在数字化转型过程中&#xff0c;企业面临着业务流程可视化与实际业…...

大模型应用指南:小白程序员必收藏,轻松入门AI前沿技术!

2025年大模型技术已在IT、金融、制造等领域广泛应用&#xff0c;从智能客服到数据分析&#xff0c;助力企业转型。沙丘智库《大模型应用跟踪月报》收录504个案例&#xff0c;揭示行业分布、应用场景及发展趋势。大模型不仅是技术突破&#xff0c;更是时代标志&#xff0c;小白程…...

Web AR技术深度探秘:7个创新案例重构浏览器增强现实体验

Web AR技术深度探秘&#xff1a;7个创新案例重构浏览器增强现实体验 【免费下载链接】AR.js Image tracking, Location Based AR, Marker tracking. All on the Web. 项目地址: https://gitcode.com/gh_mirrors/arj/AR.js 你是一个文章写手&#xff0c;你负责为开源项目…...

OpenClaw自动化周报生成:Qwen3-32B私有镜像精准提取Git提交记录

OpenClaw自动化周报生成&#xff1a;Qwen3-32B私有镜像精准提取Git提交记录 1. 为什么需要自动化周报生成 每周五下午&#xff0c;我都会面临同样的困扰&#xff1a;需要从零散的Git提交记录中手动整理本周工作内容&#xff0c;再拼凑成一份结构化的周报。这个过程不仅耗时&a…...