共用体定义:
共用体(union)是一种数据格式,它是能够存储不同的数据类型,但只能同时存储其中的一种类型。
特点:
1.成员共用内存
共用体中使用覆盖技术让数据成员之间相互覆盖,以实现不同数据成员共用同一段内存。
union demo
{
int a;
long b;
double d;
};
demo d1;
cout << "d1 is at: " << &d1 << endl;
cout << "d1.a is at: " << &d1.a << endl;
cout << "d1.b is at: " << &d1.b << endl;
cout << "d1.d is at: " << &d1.d << endl;
2.内存占用与其最大成员相等
由于共用体每次只能存储一个值,为满足共用体成员的内存需要,共用体的内存占用为其最大成员的内存占用。
union demo
{
int a;
char c;
double d;
};
cout << " int is " << sizeof(int) << "types" << endl;
cout << " char is " << sizeof(char) << "types" << endl;
cout << "double is " << sizeof(double) << "types" << endl;
cout << " union is " << sizeof(demo) << "types" << endl
3.同时只能有一个成员处于激活态
共用体中起作用的是最后一次存放的成员,在给一个新成员赋值后,旧成员就因被覆盖而失去了作用(这里的新旧是指时间上的)。
union demo
{
int a;
long b;
char c;
double d;
};
demo d1;
d1.a = 24;
d1.d = 33.24;
d1.b = 1024;
cout << d1.a << endl << d1.d << endl << d1.b << endl;
运行这段程序的结果表明,输出一个已经失去作用的数据成员是危险的,如果是相同类型并且范围大的覆盖范围小的还好,否则会得到不可预知的结果。从编译器读写数据的角度看,每种数据类型都对应不同的读写格式,假如一个共用体的最大成员占8字节,一个4字节的新成员覆盖了8字节的旧成员,输出旧成员时,由于有一部分已经改变,输出结果当然就不对了。
4.匿名共用体
共用体类型可以没有名称(没有名称的共用体称为匿名共用体),匿名共用体若定义在结构体或类中其共用体成员调用与同样定义在结构体或类中的普通共用体有所不同。
以在类中定义共用体为例
(1)匿名共用体
class Demo
{
public:
union
{
int a;
long b;
double d;
};
};
int main (void)
{
Demo D1;
cout << &D1.a << endl;
cout << &D1.b << endl;
return 0;
}
(2)普通共用体
class Demo
{
public:
union demo
{
int a;
long b;
double d;
}d1;
};
int main (void)
{
Demo D1;
cout << &D1.d1.a << endl;
cout << &D1.d1.b << endl;
return 0;
}
运行上面两段程序可以发现,在类(或结构体)中无论是定义普通共用体还是匿名共用体,其公共体成员都使用同一块内存,但两种共用体的成员调用方法却不一样。原因在于,类或结构体将匿名共用体中的共用体成员视为该类或该结构体的两个数据成员,所以不需要中间标识符,但对于有名字的共用体则将其中的共用体成员视为该类或该结构体的同一个数据成员。虽然类或结构体对定义在其中的共用体处理不同,但不影响共用体本身的特性。
应用:
由于共用体的共用内存特性,共用体常用于节省内存。当数据项使用两种或多种格式(但不会同时使用)时,可以用共用体来节省空间。虽然现在的系统内存多达数GB甚至数TB,好像没有必要节省内存,但在嵌入式系统编程中内存十分宝贵。另外,共用体常用于操作系统数据结构或硬件数据结构。
本文为博主原创文章,如需转载请征求博主同意并附上原文链接