union
先简单说说union,这个东西个人很少用,不过也是非常有效的一种数据结构。
union,顾名思义,翻译成中文名为“联合体”。
- 在一个联合体内可以定义多种不同的数据类型。union中的各个成员共用一块内存。
- 共用内存的大小是和union中占空间最大的元素所占用的空间一样大,即这些数据共享同一段内存。
- 通过这种方法,可以达到节省空间的目的。
- 与struct相同,union的默认访问权限也是公有的,而且具有成员函数。
- 不过需要注意的是,对union中不同成员的写操作,是会覆盖其他成员的值!
- union中不可以包含构造函数/析构函数/拷贝构造函数/赋值运算符/虚函数的类成员变量,因为它们共享内存,编译器无法保证对象不被破坏,也无法保证离开时调用析构函数。即使用C风格形式的struct。
- 当然,定义普通的成员函数是可以的,因为这不会使得class与C风格的struct有任何本质区别,完全可以将这样的class理解为一个C风格的struct + n个全局函数。
struct与union
union与struct有一些相似之处,但是二者有本质区别。
- 在结构体中,各个成员有各自的内存空间,一个结构变量的总长度是各成员长度的总和。
- 在联合体中,各个成员共享一段空间,一个联合变量的长度等于各个成员中最长的长度。
- 所谓的共享,不是指把多个成员同时装入一个联合变量内,而是指该联合体可被赋予任一成员值,但是每次只能赋同一种值,赋给的新值替代旧值。
二者的具体区别在于:
- 共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放一个被选中的成员, 而结构体则存放所有的成员变量。
- 对于共用体的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。
- 二者的内存分配不同。联合体的大小为其内部所有变量的最大值。
小结
请按照C中的convention去使用union,尽量不要尝试使用任何C++附加特性。
union是个好东西,union是个struct,里面所有成员共享一块内存,大小由size最大的member决定,存取成员的时候会以成员的类型来解析这块内存。