首页 > 代码库 > C语言Union

C语言Union

对于Union我用的比较少,最近一段时间大多使用Lua,所以复习一下Union

Union是共用体,顾名思义,公用一块内存

一块内存不同的访问方式

// 1.数组的便捷访问// 一块内存两种等价的访问方式template <typename T>union Mat4x4 {    struct{        T m00, m01, m10, m11;    };    T m[2][2];};int main(int argc, const char * argv[]){    Mat4x4<float> mat = {1,2,3,4};    std::cout<< mat.m00 <<std::endl;    std::cout<< mat.m[0][0] <<std::endl;    // output:  1    //          1    return 0;}

将变量拆成字节访问

int main(int argc, const char * argv[]){    union Int4 {        struct {            unsigned char _1, _2, _3, _4;        };        int _int;    };        Int4 integer;    integer._int = 100000000;    printf("%08X\n", integer._int);    printf("%02X\n", integer._1);    printf("%02X\n", integer._2);    printf("%02X\n", integer._3);    printf("%02X\n", integer._4);    // output://    05F5E100//    00//    E1//    F5//    05    return 0;}

判断CPU大小端问题

int big_endian (void){    union{        long l;        char c[sizeof(long)];    }u;        u.l = 1;    return (u.c[sizeof(long) - 1] == 1);}int main(int argc, const char * argv[]){    //在大端格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中    //与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节    if(!big_endian()) {        printf("CPU是小端模式\n");    }    else {        printf("CPU是大端模式\n");    }}

 

Union的内存占用

首先内存占用肯定是要大于最大的一项,其次因为内存对齐的缘故

int main(int argc, const char * argv[]){    // # 内存问题    union Max {        char    _1;        int     _4;        double  _8;        char    _17[17];    };        printf("size: %lu\n", sizeof(Max));    // output: size: 24        return 0;}

Union是C语言的东西,当然C++中也会有了,但是Union在C++中有些需要注意的地方。

由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。

 

C语言Union