C/C++知识点之C语言Union
小标 2018-12-03 来源 : 阅读 1234 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C语言Union,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C语言Union,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

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

Union是共用体,顾名思义,公用一块内存
一块内存不同的访问方式

// 1.数组的便捷访问
// 一块内存两种等价的访问方式
template 
union Mat4x4 {
    struct{
        T m00, m01, m10, m11;
    };
    T m[2][2];
};

int main(int argc, const char * argv[])
{
    Mat4x4 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/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved