union

作者: _gentle | 来源:发表于2018-07-28 10:04 被阅读0次

    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的成员共享存储空间,因此当数据成员时,不能有静态成员变量(编译器会报错)。

    相关文章

      网友评论

          本文标题:union

          本文链接:https://www.haomeiwen.com/subject/nkonmftx.html