在struct中,所有的成员都有自己的存储空间
在union中,所有的成员共用一块存储空间,内存分配大小与union中最大的一个数据类型相等。
1)在存储多个成员信息时,编译器会自动给struct每个成员分配存储空间,struct可以存储多个成员信息,而union每个成员会用同一个存储空间,只能存储最后一个成员信息。
2)都是由多个不同的数据类型成员组成,但在任何同一时刻,union只能存放一个被选中的成员,而结构体的所有成员都在。
3)对于union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct的不同成员赋值,是互不影响的。
注:在很多地方需要对结构体的成员变量进行修改。只是部分成员变量,那么就不能用联合体union了,因为union的所有变量只占一个内存,就比如在链表中对个别数值进行赋值就必须用struct.
1、struct和union的内存大小以及union的大小计算和struct的内存对其问题
union大小计算准则:1、至少要容纳最大的成员变量 2、必须是所有成员变量类型大小的整数倍。所以u的大小并不是12,而是16,因为它必须是所有成员变量类型大小的整数倍。
struct内存对齐问题:s里边的a占一个字节,后边补3个字节和b加起来刚好8个字节,c占8个字节,后边的d占1个字节,考虑到内存对齐的问题,应向后边再补7个字节。如果后边再加一个int型参数,那么s所占的内存还是24个,这是d后边b
#include
struct S
{
char a; //1
int b; //4
double c; //8
char d; //1
}s;
union U
{
char a; //1
int b; //4
double c; //8
int arr[3];//12
}u;
int main()
{
std::cout << sizeof(s) << std::endl;
std::cout << sizeof(u) << std::endl;
return 0;
}
/*
输出结果
24
16
*/
2、union的成员赋值
#include
struct S
{
char a;
int b;
double c;
}s;
union U
{
char a;
int b;
double c;
}u;
int main()
{
u.a = 'a';
std::cout << u.a << " " << u.b << " " << u.c << std::endl;
u.b = 100;
std::cout << u.a << " " << u.b << " " << u.c << std::endl;
u.c = 20.2;
std::cout << u.a << " " << u.b << " " << u.c << std::endl;
return 0;
}
/*
输出结果
a 97 4.79244e-322
d 100 4.94066e-322
3 858993459 20.2
*/