C++中的Union: 内存与类型转换技巧

e04c0e54826544c5947db31b3d94ba90.webp

在C++中,union是一种特殊的数据类型,允许在相同的内存位置存储不同类型的数据。union提供了一种高效地利用内存的方式,但同时也要求开发者更加小心地处理数据以避免类型错误。

1. 基本定义

union定义了一个可以存储多种类型但任意时刻只能存储其中一种类型的数据结构。union的大小至少是其成员中最大类型的大小。

示例代码

union Data {int integer;float floatingPoint;char character;
};// 示例使用
Data data;
data.integer = 5; // 当前存储的是整数

在这个例子中,Data是一个union,可以存储一个整数、一个浮点数或一个字符。任何时刻只有一个成员是有效的。

2. 使用场景

union通常用于内存映射、协议字段表示或在需要将同一段内存解释为不同类型数据的场合。

示例代码

union IPAddress {uint32_t integer;unsigned char bytes[4];
};// 示例使用
IPAddress address;
address.integer = 0xC0A80101; // 设置IP地址为192.168.1.1

这个例子展示了如何使用union来处理IPv4地址,既可以作为一个整数操作,也可以作为四个字节操作。

3. 匿名union

C++允许定义匿名union,这种union的成员可以直接在union的作用域内被访问。

示例代码

struct Container {enum {INT, FLOAT, CHAR} type;union { // 匿名unionint integer;float floatingPoint;char character;};
};// 示例使用
Container container;
container.type = Container::INT;
container.integer = 42; // 直接访问union成员

在这个例子中,Container结构体包含了一个匿名union,允许直接通过container对象访问union的成员。

4. 带有构造函数和析构函数的union

从C++11开始,union可以包含构造函数和析构函数,以及非平凡成员。这使得union可以安全地存储复杂类型。

示例代码

union ComplexUnion {std::string str; // 非平凡类型int integer;ComplexUnion() : str("Default") {} // 构造函数~ComplexUnion() { str.~string(); } // 析构函数
};

这个例子中的union包含一个std::string类型的成员,因此需要定义构造函数和析构函数来正确管理内存。

5. union与类型安全

使用union时需要小心确保当前访问的成员是正确的。错误地解释union中的数据会导致未定义行为。

示例代码

union Data {int integer;float floatingPoint;
};// 示例使用
Data data;
data.integer = 5;
float myFloat = data.floatingPoint; // 未定义行为:实际存储的是integer

在这个例子中,尝试读取未被存储的成员floatingPoint是危险的,因为当前union实际存储的是integer

总之,union是C++中一种强大但需要谨慎使用的特性。正确使用时,它可以帮助节省内存,实现底层数据处理。然而,错误的使用可能会导致程序错误和未定义行为。

 

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

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

相关文章

Python之进程池、阻塞模式、非阻塞模式、进程间的通信、queue

非阻塞模式 # 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程 # 但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法. # 初始化Poo1时&…

HTTPS 为什么比HTTP安全?

HTTPS(Hyper Text Transfer Protocol Secure)比 HTTP(Hyper Text Transfer Protocol)更安全,主要是因为 HTTPS 在 HTTP 的基础上添加了 SSL/TLS 协议,用于对数据进行加密,保证数据在传输过程中的…

数据库中SQL语句where 1=1和where 1=0

1、 背景 在实际的数据库查询中,常常会看到一些特殊的SQL语句构造,如WHERE 11、WHERE 10等,它们虽然看起来有些奇特,但在实际应用中确实有一些妙用。 其中WHERE 11用于动态构建查询条件,而WHERE 10通常用于强制不返回…

[C++] 实现Union

前几天学了replacement new写的小玩意 #include <iostream> #include <functional> #include <string>// 可能因为const char*类型的缘故 // 用const ArgsT&&...会报错// 测试用类 struct Test {Test(){std::cout << "constructed"…

Gif动态闪图如何制作?教你1分钟快速制作

动态文字闪图是一种独特而有趣的图像效果&#xff0c;通过将文字以闪烁、跳动或变换的方式呈现&#xff0c;给人一种动态感和视觉冲击力。如果你想制作自己的动态文字闪图&#xff0c;下面是一些简单的方法来帮助你完成这个任务。使用在线闪图制作网站-GIF5工具网&#xff0c;无…

国内外15款AI搜索引擎汇总

AI大模型的一个痛点就是训练数据有截止日期&#xff0c;例如chatgpt的训练数据截止日期是2021年10月。这导致模型回答截止日期之后产生的新闻事件或者专业知识时不够准确。 将AI和搜索引擎结合起来&#xff0c;似乎是一种解决方式。 目前&#xff0c;国内外公布了不少AI搜索引…

JNI入门学习 数据类型[一]

基本数据类型&#xff1a; Java 中的 int 对应 JNI 中的 jint。Java 中的 boolean 对应 JNI 中的 jboolean。Java 中的 float 对应 JNI 中的 jfloat。Java 中的 double 对应 JNI 中的 jdouble。Java 中的 byte 对应 JNI 中的 jbyte。Java 中的 short 对应 JNI 中的 jshort。Jav…

【09】进阶JavaScript事件循环Promise

一、事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有了进程后,就可以运行程序的代码了。 运行代码的「人」称之…

算法之位运算

常见的位运算操作: 首先先熟悉一下常见的位运算操作: 1. 基础位运算 左移<<, 右移>>, 按位与&, 按位或|, 按位异或^, 按位取反~ 注意: 异或其实是一种无进位相加. 2. 给定一个 n, 确定它的二进制表示中第x位是 0 还是 1 n & (1<<x) 或者 (n>…

软件工程-第11章 内容总结

如果不想读这本书&#xff0c;直接看这一章即可。 11.1 关于软件过程范型 11.2 关于软件设计方法

微信小程序开发学习笔记——4.4常见的导航栏api接口

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p29&vd_source9b149469177ab5fdc47515e14cf3cf74 一、属性 界面 / 导航栏 / wx.showNavigationBar…

算法练习第二十七天|39. 组合总和、40.组合总和II、131.分割回文串

leetcode题目链接 39. 组合总和 40.组合总和II 131.分割回文串 组合总和 class Solution {List<Integer> path new ArrayList();List<List<Integer>> result new ArrayList();public List<List<Integer>> combinationSum(int[] candidates, i…

“未等待完成”在异步操作还没有完成时,就进行下一次操作,可能导致数据不一致或逻辑错误。

等待异步操作完成就进行下一次操作可能会导致数据不一致或逻辑错误&#xff0c;这在异步操作频繁、互相独立而又不可忽略的场景中尤为常见。下面&#xff0c;我来举个例子帮助解释。 假设我们需要通过异步操作获取用户信息并渲染页面&#xff0c;页面上还需要显示用户的最新发…

Vue3+.NET6前后端分离式管理后台实战(四)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(四)已经发布&#xff0c; 程序源码已打包&#xff0c;感兴趣的可以关注下载。 2&#xff0c;源码打包可以下载&#xff1a;

leecode1793 | 好子数组的最大分数 | 求给高度矩阵最大值

题目我就不念了&#xff0c;就一个字难理解&#xff0c;给的题总是这么难懂&#xff0c;总感觉出题人的语文是体育老师教的&#xff1f; 还有就是思维转变&#xff0c;才能能好的理解&#xff1f;一味的钻牛角尖死理解&#xff0c;效果不好 思维的转变 >悟性&#xff1f;&am…

幼儿教育管理系统|基于jsp 技术+ Mysql+Java的幼儿教育管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

深入理解Ubuntu22:探索Linux操作系统的功能与应用

一、linux &#xff08;一&#xff09;、安装 1、电脑可以安装双系统&#xff0c;即在一套硬件上只能同时运行一个操作系统&#xff0c;例&#xff1a;C盘安装win&#xff0c;D盘安装linux。 2、虚拟机 虚拟机需要硬件支持&#xff0c;并需开启VT-x. 如&#xff1a;Virtual…

Checked Exception和Unchecked Exception 有什么区别?

Checked Exception: 受检异常&#xff0c;是指在Java应用程序中如果受检异常没有被catch或者throws关键字处理的话&#xff0c;程序将无法通过编译。 常见的受检异常: IOExceptionClassNotFoundExceptionSQLException Unchecked Exception:不受检异常&#xff0c;是指在程序中…

气象ARWpost、grads 等使用的ctl和dat格式的grd 二进制文件

气象ARWpost、grads 和 Fortran使用的ctldat格式的grd 二进制文件&#xff0c;在Python中可以用xgrads包来读取或者转成nc 格式使用。 xgrads包官网说明地址&#xff1a;https://xgrads.readthedocs.io/en/latest/ 示例1&#xff0c;打开多个空间场相同&#xff0c;时间不同的 …

安防监控视频汇聚平台EasyCVR接入海康Ehome设备,设备在线但视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…