0

0

C++中如何定义和使用联合体(union) 内存共享的特殊数据结构

P粉602998670

P粉602998670

发布时间:2025-07-05 11:31:07

|

520人浏览过

|

来源于php中文网

原创

联合体是c++++中一种特殊的数据类型,允许不同成员共享同一块内存。其所有成员从同一地址开始存储,整体大小等于最大成员对齐后的尺寸,如union myunion { int i; float f; };通常占4字节。定义方式类似结构体,仅用union关键字,如data d; d.num = 10; 此时仅num有效。用途包括:1. 节省内存空间,如union value { int ival; float fval; char cval; }; 比结构体节省空间;2. 处理二进制数据或协议解析,如通过union binarydata访问原始字节流或结构化数据。使用需注意:1. 避免随意切换成员访问,否则导致未定义行为;2. 内存对齐影响联合体大小,如union test { char c; int i; double d; }; 至少8字节;3. 复杂类型需手动管理生命周期,防止错误。

C++中如何定义和使用联合体(union) 内存共享的特殊数据结构

在C++中,联合体(union)是一种特殊的用户自定义数据类型,它允许你在同一块内存中存储多个不同类型的变量。因为它们共享内存空间,所以联合体常用于节省内存或者处理底层数据结构。

C++中如何定义和使用联合体(union) 内存共享的特殊数据结构

什么是联合体?

简单来说,联合体里的所有成员都从同一个内存地址开始存放,也就是说它们“共用”一块内存。这块内存的大小等于联合体中最大成员所占的空间(考虑对齐之后的大小)。这意味着,任何时候你只能安全地使用其中一个成员,否则可能会出现数据被覆盖或解析错误的问题。

C++中如何定义和使用联合体(union) 内存共享的特殊数据结构

例如:

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

union MyUnion {
    int i;
    float f;
};

在这个例子中,MyUnion占用的内存大小是sizeof(float)sizeof(int)中较大的那个,通常是4字节(在32位系统上)。

C++中如何定义和使用联合体(union) 内存共享的特殊数据结构

如何定义和初始化联合体?

定义联合体的方式和结构体非常类似,只是把关键字换成 union

union Data {
    int num;
    double bigNum;
    char ch;
};

你可以像这样声明并初始化一个联合体变量:

Data d;
d.num = 10;  // 此时只有num是有效的

如果你访问了其他字段,比如 d.bigNum,那结果将是未定义行为,因为这块内存已经被当作int来用了。

注意:C++11以后支持带构造函数、析构函数甚至匿名联合体,但这些高级用法要小心使用,容易出错。

联合体的实际用途有哪些?

1. 节省内存空间

当你有一组数据,但每次只需要用到其中一种类型的时候,可以用联合体减少内存占用

HTTPie AI
HTTPie AI

AI API开发工具

下载

举个例子,一个变量可能是整数、浮点数或者字符,但不会同时是三种类型:

union Value {
    int iVal;
    float fVal;
    char cVal;
};

如果用结构体的话,这个变量会占用 4 + 4 + 1 = 9 字节(不考虑对齐),而联合体只用4字节就够了。

2. 处理二进制数据或协议解析

网络编程或文件解析中,经常需要按字节操作数据。比如读取一段二进制数据,前4字节是整数,接下来8字节是double,也可以用联合体来灵活访问:

union BinaryData {
    uint8_t raw[12];
    struct {
        uint32_t id;
        double value;
    } data;
};

这种写法可以让你通过 raw访问原始字节流,也可以通过结构体成员解析具体含义。


使用联合体需要注意什么?

1. 不要随意切换成员访问

一旦你写入了一个成员,再读另一个成员会导致未定义行为:

union Example {
    int a;
    float b;
};

Example e;
e.a = 123;
cout << e.b; // 结果不确定,不能这么干

2. 注意内存对齐问题

联合体的大小取决于其最大成员的对齐要求。例如:

union Test {
    char c;
    int i;   // 对齐为4字节
    double d; // 对齐为8字节
};

这个联合体的大小将至少是8字节,而不是1字节。

3. 慎用复杂类型

如果联合体成员包含有构造函数、析构函数或拷贝控制的类类型,你需要手动管理生命周期,否则容易引发错误。


基本上就这些。联合体是个小巧但强大的工具,适合特定场景下使用。用得好能提升性能和灵活性,但也要注意它的限制和陷阱。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

297

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

552

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

95

2025.10.23

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

185

2025.07.04

c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

122

2023.09.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

小游戏4399大全
小游戏4399大全

4399小游戏免费秒玩大全来了!无需下载、即点即玩,涵盖动作、冒险、益智、射击、体育、双人等全品类热门小游戏。经典如《黄金矿工》《森林冰火人》《狂扁小朋友》一应俱全,每日更新最新H5游戏,支持电脑与手机跨端畅玩。访问4399小游戏中心,重温童年回忆,畅享轻松娱乐时光!官方入口安全绿色,无插件、无广告干扰,打开即玩,快乐秒达!

30

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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