考虑以下方法(在工厂方法中使用):
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);
}
最后两行代码让我感到浪费。分配更多内存并用内存中的值填充它看起来很愚蠢。
使用非托管代码,这样的事情是可能的:
m_bytes = (rawBytes + (startIndex + Packet.HeaderSize));
(我没有通过编译器运行它,因此语法可能已关闭,但您可以看到它仅仅是指针操作的问题。)
前几天,当API返回一个实际上是一个short []数组的byte []数组时,我遇到了类似的问题。
这些类型的数组排列是否只是使用托管代码的成本,还是我缺少一种新的思维流派?
提前致谢。
答案 0 :(得分:2)
您是否考虑过重组以便可能不需要复制?
第一个选项:在rawBytes
中存储对m_bytes
的引用,并将需要添加的偏移量存储到此字节数组中。
第二个选项:使m_bytes
改为MemoryStream
,从缓冲区构造,偏移量和长度;此构造函数也不复制字节缓冲区,只允许访问指定的子段。
请记住,避免复制操作的代价是rawBytes
和m_bytes
(数组或流)将是别名,因此对一个的更改也会改变另一个。
答案 1 :(得分:0)
是的,这在托管代码中代价更高,但没有什么可以阻止您使用此方法unsafe
并执行您希望执行的指针操作。