- union联合是一个能在同一个存储空间存储不同类型数据的类型。
- 联合体所占的内存长度等于其长度最长成员的长度。
- 同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用。
- 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖。
- 共用体变量的地址和它的各成员的地址都是同一地址。
union var
{
double a;
float b;
int c;
short d;
char f;
}var;
int main()
{
printf("%d\n",sizeof(var));
}
/*
结果是8;符合联合体所占的内存长度等于其长度最长成员的长度
*/
union var
{
double a;
float b;
int c;
short d;
char arr[12];
}var;
int main()
{
printf("%d\n",sizeof(var));
}
/*
结果是16;涉及内存对齐
最长的数据类型是double,占8个字节,arr占了12个字节,但是要和double对齐,占用内存是8的倍数,也就是16.
*/
union和struct的异同:
相同点:都可以包含很多种数据类型和变量。
不同点:
- 结构体:struct内存分配是不管你用不用都会给你全分配。
- 联合体:节省内存
举个例子:
#include <iostream>
using namespace std;
union vars
{
double a; //8
float b; //4
int c; //4
short d; //2
char f[12]; //12
}var;
struct stus
{
double a; //8
float b; //4
int c; //4
short d; //2
char f[12]; //12
}stu;
int main()
{
printf("%d\n",sizeof(var)); //结果是16
printf("%d\n",sizeof(stu)); //结果是32
return 0;
}
上张图便于理解
对于union来说先找共用体中占用字节最大的数据类型,是double占8个字节,再找占用空间最大的成员是arr,占用12 字节,占用空间要是8的倍数,结果就是16.
对于struct来说,分配内存大小大于等于数据成员所占内存之和。找出结构体中数据成员占用字节最大的是double占8个字节,结构体所占内存之和为30,内存补齐为8的倍数,最终为32。
ps:至于对齐系数,每个特定平台上的编译器都有自己的默认“对齐系数”,也可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
先留着坑,回头再写一篇详谈。