联合类型union提供了一种可以将几种不同类型数据存放于同一段内存中。这里主要谈三点我对其的认识和实践。
(1)所占内存
联合类型变量所占内存的大小为各个成员所占内存大小的最大者。如果其中有构造数据类型,则其大小为其中最长的基本数据类型的整数倍。具体为多少倍,取决这个构造数据类型。
测试实验:结果为24 = 3 * sizeof(double)
01.struct st{
02. int a;
03. double b;
04. float c;
05.};
06.union data{
07. st m;
08. float d;
09. int e;
10. double f;
11. };
12.data test;
13.cout<<sizeof(test)<<endl;
(2)无名联合
定义无名联合类型时,其中的成员类型可以作为变量使用。
测试实验:(结果:3.45)
01.static union {
02. float a;
03. int b;
04. };
05.a = 3.45;
06.cout<<a<<endl;
无名联合既具有其成员共享内存单元的性质,又具有不通过联合名直接存取成员的性质。一般情况下尽量不要使用无名联合,但是这种性质可以用在结构体中,会有很好的效果。
测试实验:(结果:3.45 5)
01.struct st{
02. union {
03. float a;
04. int b;
05. };
06. int c;
07. char d;
08. };
09.st test;
10.test.a = 3.45;
11.test.c = 5;
12.cout<<test.a<<'\t'<<test.c<<endl;
(3)使用define减少成员数量
先来看这个结构体st:
01.struct id{
02. int m;
03. bool n;
04.};
05.struct st{
06. union {
07. id a;
08. int b;
09. };
10. int c;
11. char d;
12. };
13.st test;
14.test.a.m = 3;
15.test.a.n = true;
16.test.c = 5;
17.cout<<test.a.m<<'\t'<<test.c<<endl;
对于结构体st,如果需要调用成员变量m,则需要两个圆点(.),如test.a.m。这时可以考虑用define定义一个新的名字来替代,这样做既可以提高程序的可读性,也可以通过定义一个新的名字来区分含义,便于理解。如下所示。其实这点在TCP/IP协议中有使用,很多报头结构体使用了这种方式。
01.struct st{
02. union {
03. id a;
04. int b;
05. };
06.#define num a.m
07.#define flag a.n
08. int c;
09. char d;
10. };
11.st test;
12.test.num = 3;
13.cout<<test.num<<endl;