Union 称为共用体,或联合体类型。union可以装入不同类型的变量,这些成员共享一段内存,可以用于节省内存。其内存大小等于最大数据成员的内存长度。
- union数据成员共享内存空间,数据成员的起始地址相同的特性还可以用于检测大端和小端
举个例子,由于test中a和b起始地址相同。如果计算机为小端(低位地址存储低位数据),则a的1将放置在低位地址,因此b的值也为1
#include <iostream>
struct normStruct {
int a;
char b;
}test1;
union MyUnion{
int a;
char b;
}test;
void checkBigOrLittleEndian() {
test.a = 1;
if (test.b == 1) std::cout << "little endian" << std::endl;
else std::cout << "big endian" << std::endl;
}
int main() {
std::cout << sizeof(test) << std::endl; //4
std::cout << sizeof(test1) << std::endl; //8
std::cout << (&test.a) << std::endl;//
std::cout << (&test.b) << std::endl;//什么都不输出,但其地址其实与a相同
checkBigOrLittleEndian();
return 0;
}
节约空间的例子
《STL源码源码剖析》第2章中,free-list节点的实现就是通过union的特性来达到节约空间的目的的
union obj {
union obj* free_list_link;
char client_data[1];
};
通过第一个数据成员,obj可以看作一个待用空间链表(free-list)中的一个节点,指向下一个free-list节点。通过第二个数据成员可以让obj指向一块实际的空间。这两个字段共用一块存储空间,达到节约内存的目的。
注意事项
由于union的成员共享存储空间,因此当数据成员时,不能有静态成员变量(编译器会报错)。
网友评论