现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

谈谈联合类型union的使用

2012-12-13 12:22 工业·编程 ⁄ 共 1374字 ⁄ 字号 暂无评论

    联合类型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; 

给我留言

留言无头像?