zoukankan      html  css  js  c++  java
  • [67节]联合体 (Unions in C++)

    Union和struct有点儿像,但是它是单纯的一个数据集合,并且,每个成员共享一个内存。这意味着,如果Union里有俩个int变量,那么这个Union集合也只占用4个字节。

    关于Union占用空间的计算可以看下面这个例子。

    #include <iostream>
    
    int main()
    {
        union A
        {
            char a;
            double b;
            char c[10];
        };
        std::cout << sizeof(A) << std::endl;
        //这个结果是16,联合体必须要容纳其中占用最多内存的成员(联合体成员共享内存)
        //同时,对齐方式需要满足所有成员 10+6/8 占用16字节。
    }

    当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union);

    (1)联合体是一个结构;

    (2)它的所有成员相对于基地址的偏移量都为0;

    (3)此结构空间要大到足够容纳最"宽"的成员;

    (4)其对齐方式要适合其中所有的成员;

    我们看一个更复杂的例子,仔细体会代码中如何把一个Vector4的4个成员,用Vector2的方式表现出来,这能非常好的解释Union在内存中的存储情况。

    #include <iostream>
    
    struct Vector2
    {
        float x, y;
    };
    
    struct Vector4
    {
        union
        {
            struct
            {
                float  x, y, z, w;
            };
    
            struct
            {
                Vector2 a, b;
            };
        };
    
    };
    
    void PrintVector2(const Vector2& vector)
    {
        std::cout << vector.x << "," << vector.y << std::endl;
    }
    
    int main()
    {
        Vector4 vector = { 1.0f,2.0f,3.0f,4.0f };
        PrintVector2(vector.a);
        PrintVector2(vector.b);
        vector.z = 500.0f;
        std::cout << "-----------------" << std::endl;
        PrintVector2(vector.a);
        PrintVector2(vector.b);
    
        std::cin.get();
    }

    它的结果是这样的

     仔细思考其中关于内存占据的问题,就会明白,z占据的空间和a.x是同一个。

  • 相关阅读:
    php 3des加密 兼容JAVA 多么痛的领悟呀
    主机序和网络序
    不用递归实现无限分类数据的树形格式化
    python学习笔记之open函数的用法
    据说是百度面试题(1)
    YII+DWZ三级城市联动挂件
    wpf 报错: 在 AddNew 或 EditItem 事务过程中不允许“DeferRefresh”。
    MVVM了解
    纪念2015年上半年
    c# 委托与事件
  • 原文地址:https://www.cnblogs.com/EvansPudding/p/12544355.html
Copyright © 2011-2022 走看看