联合体在同一内存位置存储不同数据类型,仅当前赋值成员有效。定义如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的总大小等于其最大成员所需的字节数,并按最大成员的对齐方式对齐。
立即学习“C++免费学习笔记(深入)”;
例如上面的 Data 联合体:
int 占4字节 float 占4字节 char[4] 占4字节
所以整个union大小为4字节。所有成员都从同一地址开始,读写任意成员都会覆盖这块内存。
再看一个更复杂的例子:
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++共用体内存分布的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1486620.html
微信扫一扫
支付宝扫一扫