联合体有点像类类型,或者结构体类型,只不过它一次只能占用一个成员的内存
比如结构体中有四个成员,每一个成员都有着占着不同的字节。而一个联合体只能有一个成员,也就是说如果声明了四个浮点数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会产生一些问题,但是这类事正常使用时也不太可能发生,故可不用担心,大胆用就完了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)