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[]