共用体union

当多个数据须要共享内存或者多个数据每次仅仅取其一时。能够利用联合体(union)。在C Programming Language 一书中对于联合体是这么描写叙述的:

     1)联合体是一个结构;

     2)它的全部成员相对于基地址的偏移量都为0;

     3)此结构空间要大到足够容纳最"宽"的成员;

     4)其对齐方式要适合当中全部的成员;

以下解释这四条描写叙述:

     因为联合体中的全部成员是共享一段内存的。因此每一个成员的存放首地址相对于于联合体变量的基地址的偏移量为0。即全部成员的首地址都是一样的。

为了使得全部成员可以共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合当中全部的成员”是指其必须符合全部成员的自身对齐方式。

以下举例说明:

如联合体

union U
{
    char s[9];
    int n;
    double d;
};

s占9字节,n占4字节,d占8字节。因此其至少需9字节的空间。然而事实上际大小并非9,用运算符sizeof測试其大小为16.这是由于这里存在字节对齐的问题,9既不能被4整除。也不能被8整除。因此补充字节到16,这样就符合全部成员的自身对齐了。

从这里能够看出联合体所占的空间不仅取决于最宽成员。还跟全部成员有关系。即其大小必须满足两个条件:1)大小足够容纳最宽的成员;2)大小能被其包括的全部基本数据类型的大小所整除

 

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉


一个应用:

union不论包含多少个多少种数据类型,它实例化为变量后,这个变量的长度是这个union中最长的数据类型的长度。下面的代码定义了一个union变量。它的长度是16个字节。

 union DEMO{ 
     char status;
     int a; 
     int serial[4]; 
}demo;

 


   
上面这个表格代表内存中的数据,demo.status 的值为0x1;demo.a的值为,0x4321。以此类推demo.serial的值就出来了。这个属性是union特有的,C语言的发明者为什么要弄这么个数据类型呢?现在知道了吧。因为这个union特有的属性可以帮助我们节省好多行代码。而且还不用各种基础数据类型转换。

posted @ 2017-07-21 09:22  車輪の唄  阅读(25)  评论(0)    收藏  举报  来源