新闻中心

C++ union联合体用法_C++共用体内存分布

2025-11-28
浏览次数:
返回列表
联合体在同一内存位置存储不同数据类型,仅当前赋值成员有效。定义如union Data{int i; float f; char str[4];};使用时data.i=10,则i有效,f和str未定义。

c++ union联合体用法_c++共用体内存分布

联合体(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世界 N世界

一分钟搭建会展元宇宙

N世界 138 查看详情 N世界

再看一个更复杂的例子:

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免费游戏平台入口  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】 

搜索