Union联合体(共用体)
这里稍微简单介绍一下union这种类型。
有时候需要使几种不同类型的变量存放到同一段内存单元中,例如:可把一个整型变量、一个字符串变量放在同一个地址开始的内存单元中。以上两个变量在内存中占用的字节数不同,但都从同一个地址开始存放,也就是使用覆盖技术,几个变量互相覆盖。这种使用几个不同的变量共同占用同一段内存的结构,称为union。
1 union2 {3 inta;4 charb;5 };
union的特点是:
1、同一个内存段可以用来存放几种不同类型的成员,但在同一时刻只能存放其中一种。
2、union起作用的成员是最后一次存放的变量,在存入一个新的成员后原有的成员就失去作用。
union和struct的区别
struct:所占内存长度是各成员占的内存之和,每个成员分别占用某个自己的内存单元
union:所占内存长度等于最长的成员的长度
在C#中使用union
在C#中与union交互,需要用到StructLayoutAttribute特性和FieldOffsetAttribute特性,关于这两个特性的介绍,可以参考https://www.cnblogs.com/zhaotianff/p/12510286.html
其实在知道union的原理后,在C#中进行映射也是非常简单。
如前面示例代码中的union,在C#中的表示形式如下:
1 [StructLayout(LayoutKind.Explicit)]2 structMyStruct3 {4 [FieldOffset(0)]inta;5 [FieldOffset(0)]charb;6 };
在上一篇文章中,介绍了 StructLayoutAttribute类的Pack字段,这里再介绍一下另外一个字段,StructLayoutAttribute.Size字段,Size字段用于指示类或结构的绝对大小。
在使用union时,如果不是C#中的值类型,就需要指定大小。
测试程序:
最简单的情况:
C++
1 union MYUNION2 {3 intb;4 doubled;5 };6
7 ex