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

C++ union联合体的用法_C++节省内存的数据结构技巧

尼克
发布: 2025-12-19 07:39:36
原创
973人浏览过
联合体是一种共享内存的数据结构,其大小等于最大成员,适用于节省内存的场景。例如,union Data { int i; float f; char str[20]; } 占20字节,但只能存储一个成员值。当多个变量不同时使用时,联合体可减少内存占用,如传感器数据存储从28字节减至20字节。为避免类型混淆,常结合标签枚举使用,形成带标签的联合体(Tagged Union),通过type字段标识当前有效成员。C++17引入std::variant,提供类型安全的联合体替代方案,自动管理激活类型并支持访问检查,虽略有开销但更安全可靠。新项目推荐优先使用std::variant,而传统联合体仍适用于低层、资源受限环境。

c++ union联合体的用法_c++节省内存的数据结构技巧

在C++中,union(联合体)是一种特殊的数据结构,它允许在同一个内存位置存储不同的数据类型。与结构体(struct)不同,联合体的所有成员共享同一块内存空间,因此其大小等于最大成员的大小。这种特性使得联合体成为节省内存的有效工具,尤其适用于某些特定场景。

什么是联合体?

联合体是一种用户定义的数据类型,其中所有成员共用一段内存。这意味着,在任意时刻,联合体只能保存其中一个成员的值。修改一个成员会影响其他成员的值,因为它们指向相同的内存地址。

例如:

union Data {
    int i;
    float f;
    char str[20];
};
登录后复制

这个联合体的大小是20字节(由char数组决定),但任何时候只能使用其中一个成员,否则会出现数据错乱。

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

联合体如何节省内存?

当多个变量不会同时使用时,使用联合体可以显著减少内存占用。比如在网络协议解析或嵌入式系统中,某种状态只可能属于某一类数据类型。

举例说明:

  • 假设一个传感器可能返回整数、浮点数或字符串,但每次只返回一种类型。
  • 如果用结构体存储这三种类型,总内存为 sizeof(int) + sizeof(float) + sizeof(char[20]) ≈ 4+4+20=28 字节。
  • 而使用联合体,只需要20字节,节省了8字节。

这对于资源受限的环境(如嵌入式设备)非常有价值。

带标签的联合体(Tagged Union)

直接使用联合体存在风险:无法知道当前存储的是哪个成员。为此,通常会结合一个枚举或整型“标签”来标识当前有效字段。

Tellers AI
Tellers AI

Tellers是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。

Tellers AI 136
查看详情 Tellers AI

示例:

enum DataType { INT, FLOAT, STRING };
<p>struct SafeData {
DataType type;
union {
int i;
float f;
char str[20];
} value;</p><pre class='brush:php;toolbar:false;'>void setInt(int v) {
    type = INT;
    value.i = v;
}

void print() {
    switch(type) {
        case INT:   printf("Int: %d\n", value.i); break;
        case FLOAT: printf("Float: %f\n", value.f); break;
        case STRING:printf("String: %s\n", value.str); break;
    }
}
登录后复制

};

这种方式既节省了内存,又保证了类型安全,是实际开发中的推荐做法。

C++11后的改进:std::variant

从C++17开始,std::variant 提供了更安全、更现代的替代方案。它是类型安全的联合体,能自动管理当前激活的类型,并支持访问检查。

例如:

#include <variant>
#include <string>
<p>std::variant<int, float, std::string> data = 42;
data = 3.14f;
data = "hello";</p><p>// 安全访问
if (auto<em> p = std::get_if<float>(&data)) {
printf("Float value: %f\n", </em>p);
}</p>
登录后复制

虽然 std::variant 可能比原始联合体稍大一些(用于存储类型信息),但它避免了类型误读的风险,更适合大型项目和复杂逻辑。

基本上就这些。联合体是一个强大的低层工具,适合需要精细控制内存的场合。只要注意类型管理和生命周期,就能安全高效地使用。对于新代码,也可以优先考虑 std::variant 来平衡效率与安全性。

以上就是C++ union联合体的用法_C++节省内存的数据结构技巧的详细内容,更多请关注php中文网其它相关文章!

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

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

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

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