最近我在windows上工作,我发现许多数据结构被定义为带有union
作为成员变量的struct
。 例如,Windows中的EVT_VARIANT
。
我不明白这背后的目的是什么。
当struct
包含union
成员时,它通常作为节省空间的机制完成。 如果struct
可以是某些子类型,只有某些成员才有效,那么union
是一种不浪费空间的好方法。
例如
enum NumberKind { Integer, FloatingPoint }; struct Number { NumberKind kind; union { int integerValue; float floatValue; }; };
在这种情况下,我定义了一个struct
Number,它可以有类型的数值:浮点和整数。 同时拥有两者并不是因为两个成员总是被定义而浪费空间是无效的我创建了一个union
,它使两者的存储量等于最大的大小。
根据要求提供上面的样品使用
void PrintNumber(Number value) { if (value.kind == Integer) { printf("%dn", value.integerValue); } else { printf("%fn", value.floatValue); } }
想象一下,你有一个包含数据包的结构。 数据包中的数据可以是几种不同的类型,因此您将类型存储在名为type的成员中。 因此,要读取此数据包中的数据,首先检查类型,然后读取相应的数据成员,该成员应包含数据包中的数据。
没有联合,数据结构将如下所示:
struct data { type_t type; int number; char * string; double fraction; long long big_number; }
这将是一个相当大的数据结构。 它使用足够的空间来存储每种可能的数据类型之一。 如果您在任何时间点肯定只有其中一个成员包含有用信息,那就有点不必要了。
如果我们使用工会:
struct data { type_t type; union payload { int number; char * string; double fraction; long long big_number; } }
然后struct只包含足够的空间来存储类型加上一个有效负载成员(即你将分配一个等于type_t大小的内存量加上最大可能的有效负载成员的大小)。 这节省了大量空间并且效率更高。
但是,您必须要小心,因为如果有效负载包含int,您仍然可以将其读作double。 当程序试图错误地解释数据时,您可能会得到非常奇怪的数字
作为64KB相当大的内存时代的遗留物,你有一个C ++工具,允许多个变量共享相同的内存(但显然,不是同时)。 这称为联合,有四种基本方法可供您使用:
如果你认为我是一个天才来解释工会是什么以及它的一些可能的应用,我不能因此而受到赞扬。 (:这些信息来自Ivor Horton的Beginning Visual C ++ 2010,我碰巧坐在我的办公桌上。我希望这很有帮助。
当您需要变体样式结构时,通常使用结构技术中的联合。 它通常伴随着类型标识符,用于确定要检查的联合中的哪个项目。 它也以相反的方式出现,例如在* NIX上的Xlib中,它是与结构的联合,第一个成员在所有结构之间相同,定义哪个结构具有您需要的数据。
union意味着您可以将其中一个成员作为其可能的值。 在以下示例中,您将看到每个示例的值。 但是这个联合可以是某个其他结构的成员,只需要指定一个值 – 浮点数或整数,而不是两者。 希望这可以帮助。
需要了解更多c/c++开发分享什么是工会?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
union { float u_f; int u_i; }var; var.u_f = 23.5; printf("value is %fn", var.u_f); var.u_i = 5; printf("value is %dn", var.u_i)
以上就是c/c++开发分享什么是工会?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979962.html