本文总结了union的使用方法。
定义:union是“相似”和“结构”的联合体,联合体所有成员都引用内存中的相同位置,最大成员的内存长度为union的内存大小。 union主要用于节省空间,默认权限是公共的。
注意点:
)1)可以使用同一个内存段存储几种不同类型的成员,但每个时间点只能存在一个,并且不能同时存储多个成员。 这意味着每个时刻只有一个成员起作用,其他成员不起作用,不能同时存在和起作用。
)2)在联合变量中起作用的成员是最后一个存储的成员,存储在新成员中后,原始成员将不再起作用。 这意味着所有数据成员都有相同的开始地址。
1.union的内存分配
# includeiostreamusingnamespacestd; union Node{ struct{ int a; char b; (t; int c; }Obj; struct{ int a; char b; (CT; intmain(intargc,char *argv[] ) cout'sizeof(obj )='sizeof ) obj ) endl; cout'sizeof(CT )='sizeof ) CT ) endl; //上的等于Obj.t.a=10; Obj.t.b=97; Obj.c=20; cout'Obj.t.a='Obj.t.aendl; cout'obj.t.b='int(obj.t.b ) endl; cout'Obj.c='Obj.cendl; 返回0; }输出结果:
union类Node的内存布局如下。
从执行结果可以看出,sizeof(Obj的大小与sizeof(ct的大小相同)。 也就是说,union内存大小以最大成员的内存大小作为自己的内存大小。 另外,由于Obj.t.a=Obj.c的union共享内存,变量t和c从相同的起始地址存储,因此Obj.c涵盖了Obj.t.a的值,因此输出结果如上所示。
2.union可以测试CPU的大小端
union Node{ int a; char c; }Obj; intmain(intargc,char *argv[] ) { Obj.a=1; if(obj.c==1) cout'Little'endl; else cout'Big'endl; 返回0; }上类Node的内存布局如下。
原因:对于小端序:
仓库:从小到大
a 01 00 00 00
c 01
大端模式时
仓库:从大到小
a 00 00 00 01
c 00
所以可以判断是什么样的模式。
3. union 和 struct的区别
)1) union和struct都由多个不同的数据成员组成,但union的所有成员共享内存地址,只存储最后分配的成员值,而struct可以存储,因此成员具有值。
)2) union的大小是所有成员中占用最大内存的成员的大小,其中struct是所有成员大小的“和”。