union这个关键字很少见,但是该用到还是会用到的,所以这里介绍一下
Union和struck类似,最大的不同在于,可以存储不同类型的数据,其所占内存大小以最大的为准(换而言之,一个能装char,double和int数据的union所占内存大小为double所占内存(8字节))
union所有类型的数据共用同一段内存空间,换而言之,当你对union关键字定义的变量重新赋值时,前一个值(不管它的类型为何)都会被覆盖。
当然,由于内存地址均从低位取起,所以如果你只是写入占较小内存的数据,那么原来的数据并不会全部被覆盖。
union如何使用?
union test{
int a;
char b;
struct test{
int a,b,c,d;
}//对于这个union,其内存空间占用为struct的大小——16b
}
为什么要使用联合?
其实还是为了内存的节省,如果为了每一个不同类型的变量都分配不同的内存空间,我们的内存空间就会变得紧张,如果每一次都进行对内存的回收,这又是过于繁琐的操作。
而通过联合,我们可以反复利用一个空间,达到节省空间的目的。
当然,使用联合也会带来风险,比如说误把已经覆盖写入int的联合当作char处理,显然不会得到想要的结果。
联合有什么局限性?
联合不能用于类,确切地说,联合不能存放任何有构造函数,析构函数的结构,因为这些对象可能在共享内存的过程中无法保持完整——更重要的是无法保证这个过程中会调用析构函数,这非常危险。
与此同时,联合不能用于存放不能共享内存的数据——比如引用,再比如静态变量(静态同一时间只存在一个,不能被覆盖)