新闻中心
C++ union联合体用法_C++共用体内存分布
联合体在同一内存位置存储不同数据类型,仅当前赋值成员有效。定义如union Data{int i; float f; char str[4];};使用时data.i=10,则i有效,f和str未定义。

联合体(union)在C++中是一种特殊的数据类型,允许在同一个内存位置存储不同类型的数据。同一时间只有一个成员有效,所有成员共享同一块内存空间。这使得union在节省内存和实现特定底层操作时非常有用。
联合体的基本用法
定义一个union的方式与结构体类似,但所有成员从同一地址开始存储:
union Data {
int i;
float f;
char str[4];
};
使用时只能保证当前赋值的成员是有效的:
Data data; data.i = 10; cout << "data.i: " << data.i << endl; data.f = 220.5; // 此时i的值不再有效 cout << "data.f: " << data.f << endl;注意:对某个成员赋值后,其他成员的值会变得不确定,因为它们共用内存。
内存分布与大小计算
union的总大小等于其最大成员所需的字节数,并按最大成员的对齐方式对齐。
例如上面的 Data 联合体:
- int 占4字节
- float 占4字节
- char[4] 占4字节
所以整个union大小为4字节。所有成员都从同一地址开始,读写任意成员都会覆盖这块内存。
N世界
一分钟搭建会展元宇宙
138
查看详情
再看一个更复杂的例子:
union Mixed {
long long ll; // 8字节
double d; // 8字节
int arr[3]; // 12字节
};
尽管前两个成员都是8字节,但arr占12字节,因此union大小为12字节,按8字节对齐(取决于平台)。
典型应用场景
union常用于以下场景:
- 节省内存:当多个变量不会同时使用时,可用union减少占用
- 数据 reinterpret_cast:快速查看同一数据的不同解释形式,如将float转为int查看位模式
- 硬件寄存器映射:嵌入式开发中用于访问设备寄存器的不同位段
- 序列化/反序列化:临时解析二进制数据流
例如查看float的二进制表示:
union {
float f;
uint32_t i;
} u;
u.f = 3.14f;
cout << hex << u.i << endl; // 输出f的IEEE 754编码
基本上就这些。union不复杂但容易误用,关键是理解“同一时间只一个成员有效”的原则。使用时要配合外部标记判断当前类型,否则极易引发未定义行为。C++11之后推荐使用 std::variant 来替代大部分union用途,更加安全。
以上就是C++ union联合体用法_C++共用体内存分布的详细内容,更多请关注其它相关文章!
# 推荐使用
# 长沙网站sE0推广优化公司
# 智能化网站建设业务范围
# 淘宝关键词排名查询.
# 网站建设都有什么功能
# 遵义seo公司选择21火星
# 贵州抖音seo优化
# 揭阳推广营销报价
# 象山seo优化
# 安龙县网站优化营销
# 诚信seo优化
# c++
# 多个
# 是一种
# 序列化
# 迭代
# 都是
# 解决方法
# 重写
# 体内
# 有什么
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
12306怎么选座位选到安静区_12306选座安静区域选择策略
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
基于动态规划的房屋花卉种植最小成本算法详解
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
b站赚钱渠道_b站收益来源
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
微信群消息显示延迟如何解决 微信群消息刷新优化方法
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
J*aScript实现单选按钮与关联输入框的联动禁用教程
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
J*aScript中正确使用querySelectorAll与复杂CSS选择器
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
漫蛙2漫画入口 漫蛙正版网页漫画直达网址
优化Django表单:提交验证失败后保留用户输入
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
React中useState与局部变量:理解组件状态管理与渲染机制
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
如何提高微信支付的安全性_微信支付安全防护与设置建议
AO3镜像入口大全 AO3网页版内容访问全集
痛风发作了怎么办? 快速止痛和后期饮食调理
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
Mac怎么查看崩溃日志_Mac控制台错误报告分析
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
学习通在线学习平台 学习通网页版直接进入课程中心
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
Python:递归比较文件夹内容并找出特定类型文件的差异
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
解决J*aScript中重复选择项的确认对话框显示问题
Python多版本共存与虚拟环境管理深度指南
微信语音通话掉线如何解决 微信语音通话稳定优化方法
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
composer的"require-dev"部分是用来做什么的?
如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit
poki网页游戏推荐_poki免费游戏平台入口
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】


2025-11-28
浏览次数:次
返回列表