我想尽可能以最快的方式将数组Struct1
复制到Struct2
(相同的二进制表示)数组。 我已经定义了一个联合在Struct1[]
和Struct2[]
之间转换,但是当我调用Array.Copy时,我得到一个异常,说数组是错误的类型。我怎样才能绕过这个? Buffer.BlockCopy只接受原始类型。 下面是代码:C#工会和阵列副本
[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'值。 –
如果你可以给更多的上下文,那也会有帮助。主要的问题是数组对象知道它的具体类型。 'Struct1 []'*不是'Struct2 []',反之亦然。有可能你可以使用指针来分类......我们知道得越多,我们就可以提供更多帮助。 –
我可以使用Struct3,但我想复制数组而不迭代它(低延迟应用程序),并且我测量了Array.Copy方法比简单的迭代/赋值循环(对于特定大小的数组)更快, – JJ15k