union

Union 称为共用体,或联合体类型。union可以装入不同类型的变量,这些成员共享一段内存,可以用于节省内存。其内存大小等于最大数据成员的内存长度。

  • union数据成员共享内存空间,数据成员的起始地址相同的特性还可以用于检测大端和小端
    举个例子,由于test中a和b起始地址相同。如果计算机为小端(低位地址存储低位数据),则a的1将放置在低位地址,因此b的值也为1
#include 
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的成员共享存储空间,因此当数据成员时,不能有静态成员变量(编译器会报错)。

你可能感兴趣的:(union)