我正在尝试将一个Struct1
数组快速地复制到一个Struct2
数组中(二者具有相同的二进制表示方式)。我定义了一个联合体来在Struct1[]
和Struct2[]
之间进行转换,但是当我调用Array.Copy时,会出现错误类型的异常。如何绕过这个问题?Buffer.BlockCopy只接受原始类型。
以下是代码:
[StructLayout(LayoutKind.Explicit)]
public struct Struct12Converter
{
[FieldOffset(0)]
public Struct1[] S1Array;
[FieldOffset(0)]
public Struct2[] S2Array;
}
public void ConversionTest()
{
var s1Array = new{new Struct1()}
var converter = new Struct12Converter{S1Array = s1Array};
var s2Array = new Struct2[1];
Array.Copy(converter.S2Array,0,s2Array,0,1) //throws here
//if you check with the debugger, it says converter.S2Array is a Struct1[],
//although the compiler lets you use it like a Struct2[]
//this has me baffled as well.
}
为了提供更多细节: 我想进行实验,看看使用可变结构并改变其字段的值是否与始终使用相同的不可变结构具有不同的性能特征。我认为它应该是类似的,但我认为这值得测量。底层应用程序将是一个低延迟套接字库,我目前使用基于
ArraySegment<byte>
的套接字API。碰巧在SocketAsyncEventArgs
API中,设置BufferList
属性会触发数组复制,这就是我的“实验”失败的地方(我有一个MutableArraySegment
数组,我无法通过与之前相同的方法将其转换为ArraySegment[]
,因此使我的比较毫无意义)。
Struct3
,实际上是由Struct1
和Struct2
组成的联合体?然后你可以创建一个Struct3[]
,首先分配所有Struct1
的值,然后读取出Struct2
的值。 - Jon SkeetStruct1[]
不是Struct2[]
,反之亦然。使用指针可能可以解决问题……再次强调,我们了解得越多,就能提供越多帮助。 - Jon Skeet