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