C++ union介绍


union的定义和特性

C++union是继承自C的复合类型,和C语言中的union定义保持一致。union具有以下特点:

  1. union中所有成员共享同一段内存,所有成员起始地址相同;
  2. union的长度由最大长度的成员与类型长度最大的成员共同决定,其长度是类型长度最大的成员长度的整数倍;
  3. union的成员只能是内置类型和除引用外的复合类型;
  4. union不可以有静态成员。

union的长度

上面第二点描述了union的长度,理解起来可能有点绕,来看下面的例子:

1
2
3
4
union U {
char ac[10];
double d;
};

sizeof(U)的值必须不小于sizeof(char[10]),且是其类型长度最大成员d的长度的整数倍,在32位下,sizeof(double) == 8,所以,sizeof(U) == 16

union的成员类型

对于以上第三点,需要注意C++中的struct对于C语言struct的改变。C++中的struct可以用来定义C式结构体和类类型(class也一样)【C++内置类型和复合类型】。看下例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
public:
int val;
A(){} //默认构造函数
};

union U {
A a; //A存在默认构造函数,是类类型,编译器报错
char b;
};

int main()
{
U u;
u.a.val = 10;
cout << u.a.val << endl;
return 0;
}

上面的代码编译器会报错:

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
2
3
4
5
6
7
8
bool isLittleEndian() {
union testUnion{
int a;
char c;
} test;
test.a = 1;
return test.c == 1;
}

总结

C++ union的使用应保持和C语言一致,应注意避免C++语言特性带来的隐性改变。