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

原文地址:https://www.cnblogs.com/EvansPudding/p/12544355.html