首页 > 后端开发 > C++ > 正文

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

穿越時空
发布: 2025-11-28 14:46:02
原创
709人浏览过
联合体在同一内存位置存储不同数据类型,仅当前赋值成员有效。定义如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的总大小等于其最大成员所需的字节数,并按最大成员的对齐方式对齐。

立即学习C++免费学习笔记(深入)”;

例如上面的 Data 联合体:

  • int 占4字节
  • float 占4字节
  • char[4] 占4字节

所以整个union大小为4字节。所有成员都从同一地址开始,读写任意成员都会覆盖这块内存。

腾讯交互翻译
腾讯交互翻译

腾讯AI Lab发布的一款AI辅助翻译产品

腾讯交互翻译 183
查看详情 腾讯交互翻译

再看一个更复杂的例子:

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++共用体内存分布的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号