union的定义和特性
C++union是继承自C的复合类型,和C语言中的union定义保持一致。union具有以下特点:
- union中所有成员共享同一段内存,所有成员起始地址相同;
- union的长度由最大长度的成员与类型长度最大的成员共同决定,其长度是类型长度最大的成员长度的整数倍;
- union的成员只能是内置类型和除引用外的复合类型;
- union不可以有静态成员。
union的长度
上面第二点描述了union的长度,理解起来可能有点绕,来看下面的例子:
1 | union U { |
sizeof(U)
的值必须不小于sizeof(char[10])
,且是其类型长度最大成员d的长度的整数倍,在32位下,sizeof(double) == 8
,所以,sizeof(U) == 16
。
union的成员类型
对于以上第三点,需要注意C++中的struct对于C语言struct的改变。C++中的struct可以用来定义C式结构体和类类型(class也一样)【C++内置类型和复合类型】。看下例代码:
1 | class A { |
上面的代码编译器会报错:
1 | note: default constructor of 'U' is implicitly deleted because variant field 'a' has a non-trivial default constructor |
如果将class A的默认构造函数去除,则没有问题。
union的使用
union常用于测试CPU大小端问题。如下代码:
1 | bool isLittleEndian() { |
总结
C++ union的使用应保持和C语言一致,应注意避免C++语言特性带来的隐性改变。