首先看一下结构体,c语言中的结构体占用字节数是所有类型字节数的总和。

例如:

struct node
{
int a;
int b;
}

用sizeof测试一下结果是8,但是如果用union呢?会发现结果是4

union中的参数共用同一块内存空间,它们在内存中起始地址都相同,也就是说同一时间内联合体中其实只会有一个参数存在,当另一个参数被赋值时,此时内存中存的就是另一个参数的值,而前面的参数会被覆盖

但是size并不一定是根据最长的那个长度来决定的(实测不是,但是不懂),还要考虑内存对齐的问题

如果此时已经给某一变量赋上了值,再用另外一个变量输出,那么内存中的编码并不会改变,只是会按找相应类型的编码方式进行编码然后输出。

  • 在c++中的使用

大致相同,但是union中不能有类,如果我们在再类CA中添加了构造函数,或者添加析构函数,我们就会发现程序就会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针

  • 应用 类型转换

因为union共用一片地址,所以我可以通过不同的定义去访问这片地址。例如一个double类型的数据,我可以用int型访问低四字节和高四字节,并且不改变位级别的数据,这就相当于类型转换