【C语言】Union

一.Union的用法

1.什么是Union?

union 共用体名{

成员列表

};

union,"联合体、共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

2.为什么使用union?

2.1.解决"相同信息"的困扰,避免重复代码,提高代码的简洁性。

相同成员公用,差异成员则通过 union 区分,这就避免了代码重复,也避免了代码耦合。

2.2.节省内存

C语言程序常用于资源比较紧张的嵌入式设备中,因此合格的C语言程序员应该都是"抠门"的,尽可能的节约资源。如果一些数据不可能在同一时间同时被用到,则可以使用union。

3.如何使用union?

eg:

Video info 是用于描述视频信息的结构体

有视频的地方常常也会有音频,所以我们的C语言程序还需要描述音频信息。音频信息也包括名称、地址、时间等信息,不过它也有与视频不同的参数,例如采样率,通道数。所以使用C语言描述音频信息,可以使用下面这个结构体:

这样一来,C语言程序描述视频和音频就简单了,只要使用 video_info 和 audio_info 结构体就可以了:

但是video_info 和 audio_info 仅个别成员不同,可以合并同类项:

合并以后需要描述视频和音频时,都使用 av_info 结构体:

不过,这样虽然将 video_info 和 audio_info 的重复代码合并了,同样也导致结构体所占用的内存变大了。同时代码的耦合性增强:用于描述视频的 vinfo 也能访问音频才有的 chnnl_cnt,用于描述音频的 ainfo 也能访问视频的 alg。

那这种情况下,C语言有没有办法,既能避免重复代码,又能避免耦合,同时还能节约资源呢?自然是有的,C语言中的 union 语法就是为此而设计的:

因为视音频都有名称、地址、大小信息,所以 av_info 中的 name,address,size 成员在描述视频和音频时都会被使用。视音频具有差异的几个成员则使用 union 描述,union 中的 vinfo和 ainfo 共用一块内存区域。

此时访问视频的编码算法和时间信息,可以如下实现:

访问音频的采样率和通道数,可以如下实现:

从上面这几行C语言代码可以看出,此时视音频的相同成员公用,差异成员则通过 union 区分,这就避免了代码重复,也避免了代码耦合。另外,由于union 中的 vinfo和 ainfo 共用一块内存空间,内存浪费的问题也解决了。这里说的节省内存,是相对于直接合并video_info 和 audio_info那种情况的节省。

二.union和struct的区别

结构体和共用体的区别在于:

结构体(struct)中所有变量是"共存"的------优点是"有容乃大",全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。

而联合体(union)中是各变量是"互斥"的------缺点就是不够"包容";但优点是内存使用更为精细灵活,也节省了内存空间。

结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

相关推荐
无限的鲜花6 分钟前
协程本质是函数加状态机——零基础深入浅出 C++20 协程
c++·算法·c++20
逝水无殇10 分钟前
C# 字符串(String)详解
开发语言·后端·c#
精明的身影16 分钟前
C++自学之路1:Hello world
开发语言·c++
旖-旎33 分钟前
《LeetCode 64 最小路径和 || LeetCode 174 地下城游戏》
c++·算法·leetcode·动态规划
森林古猿11 小时前
再论斜率优化
c++·学习·算法
leo__5201 小时前
基于导航数据的扩展卡尔曼滤波(EKF)MATLAB 实现
开发语言·matlab
万法若空1 小时前
【数学-简单数论】同余中的逆
线性代数·算法
gugucoding1 小时前
25. 【C语言】二进制文件与随机读写
c语言·开发语言
北极星日淘1 小时前
中古货品品相评级算法实战|Java权重计分实现标准化五级品相体系
开发语言·python
小巧的砖头2 小时前
C#会重蹈覆辙吗?系列之2:反射及元数据的性能问题
开发语言·前端·c#