我正在尝试以最快的方式将数组复制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[]
通过与以前相同的方法转换为的数组,因此我的比较毫无意义)。