• [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是同一个。

  • 相关阅读:
    Json:前台对象数组传到后台解析
    const和static readonly 区别
    C#中Abstract和Virtual
    浅谈算法和数据结构: 一 栈和队列
    谈谈数据库的ACID
    C#面试:委托
    哈希表
    平衡查找树之红黑树
    机器学习/深度学习 问题总结及解答
    2018Java研发实习内推
  • 原文地址:https://www.cnblogs.com/EvansPudding/p/12544355.html
Copyright © 2020-2023  润新知