union联合体的缺陷
传统的 union 联合体在 C++ 中虽然提供了一种能够在相同的内存空间内存储多种不同类型的方式,但它也有一些显著的缺陷和限制。这些缺陷让 union 的使用不太安全,尤其是在复杂的程序中。以下是传统 union 的几个主要缺陷:
1. 类型安全性缺失
union可以同时存储不同类型的值,但它不提供任何机制来追踪当前存储的具体类型。- 程序员需要自行管理
union当前保存的类型,误用时可能会引发未定义行为。例如,存储了int类型的值后,如果尝试读取为double,程序可能会崩溃或产生错误的结果。 - 没有类型检查,意味着编译器不能确保你正在访问正确的数据类型。
示例:
union MyUnion {
int i;
double d;
};
MyUnion u;
u.i = 42; // 正确,存储 int
std::cout << u.d; // 错误,试图读取 double,未定义行为
2. 不支持复杂数据类型
- 传统的
union只能存储简单的类型(如int、float等原始类型),而不能直接存储复杂类型(如含有构造函数或析构函数的类对象)。 - 在存储复杂类型时,程序员需要手动管理这些类型的构造和析构操作,增加了代码的复杂性和出错几率。
示例:
union MyUnion {
std::string s; // 错误,std::string 有构造和析构函数
int i;
};
要解决这个问题,你必须使用显式构造和析构函数调用,例如通过 placement new 和手动调用析构函数,这对程序员来说既麻烦又容易出错。
3. 数据对齐和内存浪费
union的大小等于其包含的最大类型的大小,这会导致对齐问题和潜在的内存浪费。例如,某些类型需要特定的内存对齐方式(如double类型通常需要 8 字节对齐),而这会导致union的大小比所需的实际数据大小更大。
示例:
union MyUnion {
char c;
double d; // 占用的空间比 char 大得多
};
// sizeof(MyUnion) 将为 sizeof(double),而不是 sizeof(char)
4. 缺乏构造函数和析构函数
union无法自动管理复杂对象的生命周期,因为它不能包含构造函数或析构函数。- 当使用
union存储带有资源管理(如内存分配、文件句柄等)的复杂类型时,程序员必须手动处理资源的分配和释放,这增加了编写代码的负担,也容易出错。
5. 不支持类成员函数
union中不能包含非静态成员函数,只能包含数据成员,这在某些情况下限制了设计的灵活性。要在union中使用方法,必须将它们声明为静态成员。
总结
- 类型安全问题 是
union的最大缺陷,程序员需要手动管理当前存储的类型,容易出错。 - 不支持复杂类型,使得
union无法直接用于存储对象类型,必须手动管理对象的生命周期。 std::variant是union的现代替代方案,解决了这些问题,提供了类型安全、自动类型管理以及对复杂类型的支持。
union联合体的缺陷的更多相关文章
- C/C++ union联合体介绍
C/C++ union联合体介绍 文章参考:https://blog.csdn.net/mooneve/article/details/92703036 目录 C/C++ union联合体介绍 1. ...
- union联合体使用详解
1.联合体联合体(union)与结构体(struct)有一些相似之处.但两者有本质上的不同.在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和.而在联合体中,各成员共享一段内存 ...
- (转)C语言union(联合体 共用体)
一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住.这次看书又看到了,还是学习一下吧.一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂.本质上来说 ...
- C++基础之---union联合体大小分析
#include <iostream> using namespace std; union un { int a[7]; double b; char c[10]; int d[3]; ...
- union联合体学习
union,中文名“联合体.共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. 不过区别也挺明显: 结构体(st ...
- union联合体
今天笔试的一道题,好久没用union了,竟然忘光光了. 关于其大小的计算,分两步:先算对齐大小(成员中字节最大的那个),再算分配空间: 不仅是对齐大小的整数倍,还要满足实际大小不能小于最大成员大小. ...
- 转:union 联合体(共用体)
转自:http://blog.csdn.net/xiao3404/article/details/22276485 2.共用体 2.1共用体的概念 共用体是一种构造类型的数据结构.在一个“共用体”内可 ...
- [C++]union联合体总结
特点一:成员公用内存,且按所占内存最大的数据成员分配内存 //举例1 union A{ char a;//1个字节 int b;//4个字节 char c;//1个字节 } cout<<s ...
- C++中联合体(union)的使用
typedef union para { ]; struct { double a; double b; double c; double d; }NP; }NPara; //或者如下所示 union ...
- 结构体struct、联合体union、枚举类型enum
1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...
随机推荐
- 缓存框架 Caffeine 的可视化探索与实践
作者:vivo 互联网服务器团队- Wang Zhi Caffeine 作为一个高性能的缓存框架而被大量使用.本文基于Caffeine已有的基础进行定制化开发实现可视化功能. 一.背景 Caffei ...
- Python列表、元组、字典和集合的用法
1.列表 标志符号是[],元素可以修改.删除和新增 1.1 提取元素(索引从0开始计算) testList=['A','B','C',1,'D'] print(testList[1]) #打印索引区间 ...
- 加油,为Vue3提供一个可媲美Angular的ioc容器
为什么要为Vue3提供ioc容器 Vue3因其出色的响应式系统,以及便利的功能特性,完全胜任大型业务系统的开发.但是,我们不仅要能做到,而且要做得更好.大型业务系统的关键就是解耦合,从而减缓shi山代 ...
- 两个 RTX2070 super 显卡 可不可以通过 nvlink交换机 进行P2P通信 呢? (答案: 可以)
以前转载了一篇文章: https://www.cnblogs.com/devilmaycry812839668/p/12370685.html 对于里面的结果总感觉有所怀疑,于是斥巨资购入两个 ...
- 【转载】 NFS服务器端的权限设置学习 Linux运维学习
原文地址: http://blog.chinaunix.net/uid-31484238-id-5785140.html ======================================= ...
- 为什么被要求避免使用orcid
前段时间收到了最高机构的通知,要求不要使用orcid,并对之前使用的情况进行自查.得到这个通知,我其实还是蛮无感的,毕竟我一篇论文也没法过,而且也没有用过这个orcid,虽然我自己也是有这个的. 关于 ...
- MFC对话框程序:实现程序启动画面
MFC对话框程序:实现程序启动画面 对于比较大的程序,在启动的时候都会显示一个画面,以告诉用户程序正在加载,或者显示一些关于软件的信息,如Visual C++,Word, PhotoShop等.那么对 ...
- .NET中各种线程同步锁
编程编的久了,总会遇到多线程的情况,有些时候我们要几个线程合作完成某些功能,这时候可以定义一个全局对象,各个线程根据这个对象的状态来协同工作,这就是基本的线程同步. 支持多线程编程的语言一般都内置了 ...
- 是技术牛人,如何拿到国内IT巨头的Offer
不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...
- 使用sl+tmux哇娃
0x01 背景 2岁多的小娃不肯刷牙,有时看故事书时会配合刷一会儿,但偶尔也不好使.突然想到TA,之前在电脑桌旁边捣乱时,给ta看过console中的小火车,ubuntu中安装sl命令后就可以看到,用 ...