联合体

联合体,第1张

67.联合体(union) in C++

联合体有点像类类型,或者结构体类型,只不过它一次只能占用一个成员的内存

比如结构体中有四个成员,每一个成员都有着占着不同的字节。而一个联合体只能有一个成员,也就是说如果声明了四个浮点数abcd,他们共用一个内存空间,即4个字节

而人们用联合体来做的事情,是和类型双关紧密相关的

在你想给同一个变量取两个不同的名字时,它真的很有用(引用:???),当然,可读性上是一定比引用要好的

  • 比如有一个正常的abc,有一个坐标轴上的xyz,我想让abc和xyz一一对应,则可以把a和x放一个union,b和y放一个union,以此类推

通常union是匿名使用的,但是匿名union不能含有成员函数

union { };,注意这里是有分号的!!
#include 
int main() {
    //匿名使用,即是不写名字,惊了
    union {
        float a;
        int b;
    };	//注意这里要加分号!!!!
    a = 2.0f;
    std::cout << a << ' ' << b << std::endl;
    //会得到输出: 2 107165123
    //这里前面的a是正常的,但是第二个输出就很诡异
    //出现这种状况的原因是:取了组成浮点数的内存,然后把它解释成一个整型(类型双关)
}

故此,union通常被用来做类型双关(比如用着int的内存,却将这段内存解释成double去使用

来看看一个更有用的例子

#include 
#include 

struct vec2 {
    int a, b;
}
struct vec4 {
    int a, b, c, d;
}

当想把vec4中的四个元素当作两个vec2来看待的时候,union就排上用场了

#include 
#include 
using namespace std;
struct vec2 {
    int x, y;
}
struct vec4 {
    union {
        struct {
            int a, b, c, d;
        }
        struct {
            vec2 v1, v2;	//因为两个结构体共用一个内存,而abcd内存分布上又是连续的,所以可以用两个vec2代替abcd
        }
    }
}
int main() {
    vec4 temp;
    cout << temp.v1.x << temp.v2.y;	//等同于把a,b输出出去
}

如此,用多种方法来处理相同的数据是,union都非常有用,并且**用union进行类型双关可读性更佳!**但union会产生一些问题,但是这类事正常使用时也不太可能发生,故可不用担心,大胆用就完了

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/789671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存