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

在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)
直接使用联合体存在风险:无法知道当前存储的是哪个成员。为此,通常会结合一个枚举或整型“标签”来标识当前有效字段。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~