C++中struct和union的区别
1. 二者都是由不同的数据类型成员组成(否则也不需要定义这俩),但在任何同一时刻, 结构体存放所有的成员变量, 而共用体只存放一个被选中的成员。
2. 对于共用体的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。比如:
3. 内存分配上有所不同,struct每个元素都有自己的内存空间,且们在内存中的存放是有先后顺序的,顺序就是你声明变量的顺序;union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给union的内存size 由类型最大的元素 size 来确定。正因如此,当为一个struct和union分配内存时,内存对齐不同。
(1)union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小。如下:
typedef Union
{
char c[10];
char cc1;
}u11;
typedef union
{
char c[10];
int i;
}u22;
typedef union
{
char c[10];
double d;
}u33;
sizeof(u11)结果是10
sizeof(u22)结果是12,按照sizeof(int)*3分配空间
sizeof(u33)结果是16,按照sizeof(double)*2分配空间。
(2)结构体struct分配方法类似,也是按照最大类型的倍数进行分配大小,但是还与顺序有关。如下:
typedef struct s1
{
char c;
double d;
}s11;
typedef struct s2
{
char c;
char cc;
double d;
}s22;
typedef struct s3
{
char c;
double d;
char cc;
}s33;
sizeof(s11)结果是应该是9,但是系统按照sizeof(double)*2分配,所以大小是16
sizeof(s22)结果是应该是10,但是系统按照sizeof(double)*2分配,所以大小是16,先分配8字节给c,c占用一个字节,剩余7字节可以存储cc,所以系统没有额外给cc分配内存。cc有了内存后剩余6字节无法存储d,系统就额外为d分配8字节,整个分配浪费内存6字节。
sizeof(s33)结果是应该是10,但是系统按照sizeof(double)*3分配,所以大小是24,因为和定义顺序有关,所以当给c分配8个字节之后,剩余7个字节无法存储d,所以系统又分配了8个字节给d,之后又分配8个自己给cc,分配完后浪费了14个字节的空间。所以,在定义结构体struct 的时候按照s22的顺序分配可以节省内存。