什么是Union #
union
(联合体)是一种特殊的数据结构,它允许你在同一个内存位置存储不同类型的数据。union
中的所有成员共用同一块内存区域,意味着一个union
变量的所有成员共享相同的内存地址。因此,union
中最多只能有一个成员变量有效。
C++ Union 的使用 #
Union 的定义 #
定义 union
的方式与结构体相似,语法如下:
union UnionName {
MemberType1 member1;
MemberType2 member2; // ...
};
Union 使用实例 #
#include <iostream>
union Data {
int i;
float f;
char c;
};
int main() {
Data data;
data.i = 10;
std::cout << "data.i: " << data.i << std::endl;
data.f = 3.14;
std::cout << "data.f: " << data.f << std::endl;
std::cout << "data.i after setting data.f: " << data.i << std::endl; // 注意这一行
data.c = 'A';
std::cout << "data.c: " << data.c << std::endl;
std::cout << "data.f after setting data.c: " << data.f << std::endl; // 注意这一行
return 0;
}
上述代码的输出结果为:
data.i: 10
data.f: 3.14
data.i after setting data.f: 1078523331
data.c: A
data.f after setting data.c: 1.36424e-43
在这个例子中,由于union
中的所有成员共享相同的内存位置,所以在修改data.f
或data.c
后,data.i
的值被覆盖,输出值也会发生变化。
总结 #
union
的特性 #
- 内存共享:
union
中的所有成员共用一块内存,union
的大小取决于其最大成员的大小。 - 一次只能保存一个值:虽然
union
可以有多个成员,但在任何给定时刻只能存储一个有效值,其他成员的值会被覆盖。
union和struct的区别 #
- 内存布局
struct:每个成员都有自己的内存空间,结构体的大小是所有成员大小的总和加上可能的对齐填充。
union:所有成员共用同一块内存,union的大小是最大成员的大小。
- 同时访问
struct:可以同时访问所有成员,因为每个成员占用不同的内存区域。
union:只能访问一个成员,访问其他成员时,结果是未定义的。
- 用途
struct:用于组合不同类型的变量,以便能够同时存储和访问这些变量。
union:用于节省内存,特别是在已知同一时刻只需要存储其中一个变量的情况下。