作者:hahaya
日期:
之前只是知道有union这个东西,但是几乎没有使用过,最近在看libevent的源码,发现其中用到了union,就查了一些关于union的资料,发现union有很多妙用,就顺便记录在此。
联合union
union和struct有一些相似之处,但是两者有本质上的不同。在struct中,每个成员有各自的内存空间,一个struct变量的总长度是各成员长度之和。而在union中,各成员共享一段内存空间,一个union变量的长度等于各成员中最长的长度。这里所谓的共享不是指多个成员同时装入一个联合变量中,而是只该union变量可以被赋予任一成员指,但是每次只能赋一种值,赋入新值则冲去旧值,下面使用一个例子说明:
使用union让代码更加方便阅读
假设需要一个3*3的数组,我们可以使用如下方法写:
使用union节省内存
假设有一个二叉树,根节点和中间节点不存放数据,只存放左右子节点指针,而叶子节点只存数据而没有子节点,我们有如下两种方法定义二叉树的节点
在32位机器上,使用结构体时,需要的内存空间大小为:4 + 4 + 8 = 16,而使用联合union时,需要的内存空间大小为最大长度成员需要的内存空间大小,即为:8。由此可知,使用union能节省每个节点能节省一半的内存空间。在libevent中也有许多类似的用法。