2009-06-01 2 views
0

は(ファクトリメソッドで使用される)は、以下の方法を考えてみましょう:マネージコードでサブセットbyte []配列をマーシャリングするにはどうすればよいですか?

private Packet(byte[] rawBytes, int startIndex) 
{ 
    m_packetId = BitConverter.ToUInt32(rawBytes, startIndex); 
    m_dataLength = BitConverter.ToUInt16(rawBytes, startIndex + 4); 
    if (this.Type != PacketType.Data) 
     return; 
    m_bytes = new byte[m_dataLength]; 
    rawBytes.CopyTo(m_bytes, startIndex + Packet.HeaderSize); 
} 

コードの最後の2行は無駄な私を打ちます。より多くのメモリを割り当て、メモリから値を取り込むことは愚かなようです。アンマネージコードで

、このようなものが可能です:

m_bytes = (rawBytes + (startIndex + Packet.HeaderSize)); 

(構文は、おそらくオフになっているので、私は、コンパイラによってそれを実行しませんでしたが、あなたはそれがポインタ操作の問題だ見ることができます。)

APIが本当に短い[]配列だったbyte []配列を返すと、先日同様の問題が発生しました。

これらのタイプの配列置換は、マネージコードを使用する単なるコストですか、私が見逃している新しい考え方ですか?

ありがとうございます。

答えて

2

リストラを考慮して、コピーが必要でない可能性がありますか?

最初のオプション:rawBytesへの参照をm_bytesに格納し、すべてのアクセスに追加する必要があるオフセットをこのバイト配列に格納します。

第2のオプション:代わりに、をMemoryStreamとし、オフセットと長さをバッファから構成します。このコンストラクタもバイトバッファをコピーせず、指定されたサブセグメントへのアクセスのみを許可します。

コピー操作を避けるためには、rawBytesm_bytes(配列またはストリーム)がエイリアスになるため、一方を変更すると別のものも変更されることに注意してください。

0

はい、これは管理コードの方がコストがかかりますが、このメソッドを作成することからあなたがやりたいと思うポインタ操作をやめることは何もありません。

関連する問題