0

0

C++ union如何节省内存_C++共用体内存共享机制与使用限制

冰火之心

冰火之心

发布时间:2025-12-27 17:42:07

|

603人浏览过

|

来源于php中文网

原创

共用体通过共享内存节省空间,所有成员共用同一内存区域,大小由最大成员决定,适用于变体类型、硬件映射等场景,但需手动管理当前激活成员,不能含非平凡构造的类,现代C++推荐使用std::variant替代。

c++ union如何节省内存_c++共用体内存共享机制与使用限制

在C++中,union(共用体)是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。它通过内存共享机制实现节省内存的目的,适用于某些特定场景下的内存优化。下面详细说明其工作原理和使用限制。

内存共享机制:同一块内存被多个成员共用

共用体的所有成员共享同一段内存空间,其大小等于最大成员所需的字节数。这意味着任何时候只能有一个成员处于有效状态。

例如:
union Data {
    int i;
    float f;
    char str[8];
};

这个 Data 共用体的大小为 8 字节(由 char str[8] 决定),无论你使用哪个成员,都使用这 8 字节中的同一区域。

  • 当你给 i 赋值后,再读取 f,结果是未定义的(位模式解释不同)
  • 共用体不会自动记录当前激活的是哪个成员,程序员必须自行管理

如何节省内存:避免为多个互斥字段分配独立空间

在资源受限或需要高效存储的场景下,共用体非常有用。典型应用包括:

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

LongShot
LongShot

LongShot 是一款 AI 写作助手,可帮助您生成针对搜索引擎优化的内容博客。

下载
  • 表示一种“变体”类型,比如某个变量在不同情况下可能是整数、浮点数或字符串指针
  • 硬件寄存器映射:同一组寄存器在不同模式下代表不同含义
  • 网络协议解析:某些字段根据标志位解释为不同类型
对比结构体:

如果使用 struct 存储上述 Data 类型的三个字段,总大小至少是 int + float + char[8] 的对齐总和,通常远大于 8 字节。而 union 只需最大成员的空间,显著减少内存占用

使用限制与注意事项

尽管能节省内存,但共用体有严格的使用约束:

  • 不能包含具有非平凡构造函数、析构函数或拷贝控制的类类型(如 std::string、std::vector)
  • C++11 起支持带构造函数的类,但需手动管理生命周期(使用 placement new 和显式析构)
  • 访问非当前写入的成员属于未定义行为,编译器不作检查
  • 无法继承其他类,也不能作为基类
  • 不支持 static 成员变量

为安全使用共用体,常配合一个枚举标记当前状态:

struct SafeData {
    enum Type { INT, FLOAT, STRING } type;
    union {
        int i;
        float f;
        char str[8];
    };
    
    void setInt(int val) {
        type = INT;
        i = val;
    }
    // 使用前检查 type 判断当前有效成员
};

基本上就这些。共用体适合对内存敏感且能严格控制状态切换的底层编程场景,但现代C++更推荐使用 std::variant(C++17)来替代,它提供了类型安全的多态存储,虽然略有运行时开销,但更安全易用。

相关专题

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

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

295

2023.10.31

php数据类型
php数据类型

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

216

2025.10.31

string转int
string转int

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

311

2023.08.02

css中float用法
css中float用法

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

551

2024.04.28

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

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

94

2025.10.23

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

14

2025.11.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.04

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

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

精品课程

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

共14课时 | 0.7万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 4.9万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

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

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