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

  • 相关阅读:
    typedef的用法
    重定向在网络编程中的理解
    简答的理解C语言中的各种类型函数
    栈、堆、静态存储区
    标识符起作用范围----作用域、连接类型、存储期
    main函数的argc和argv
    基本数据类型
    数组与指针
    第一章 CLR的执行模型
    Revit 二次开发 沿弧形路径创建拉伸屋顶
  • 原文地址:https://www.cnblogs.com/EvansPudding/p/12544355.html
Copyright © 2011-2022 走看看