我想要利用新的Memory
和Span
类来实现对缓冲区的零拷贝,并通过struct
访问数据,以用于网络协议的实现。
我有以下人为示例:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Data
{
public int IntValue;
public short ShortValue;
public byte ByteValue;
}
static void Prepare()
{
var buffer = new byte[1024];
var dSpan = MemoryMarshal.Cast<byte, Data>(buffer);
ref var d = ref dSpan[0];
d.ByteValue = 1;
d.ShortValue = (2 << 8) + 3;
d.IntValue = (4 << 24) + (5 << 16) + (6 << 8) + 7;
}
结果是
buffer
中存储了7,6,5,4,3,2,1
,这正是所需的,但我几乎无法想象MemoryMarshal.Cast
是唯一的方法(除了任何需要unsafe
关键字的方法)。我尝试了其他一些方法,但我无法弄清如何将它们与ref struct
(不能用作通用类型参数)一起使用,也不知道如何获取实际缓冲区中的结构体而不是副本(对其进行的任何更改都不会反映在缓冲区中)。是否有更简单的方法从缓冲区获取此可变结构体?
Span<T>
的一个关键点是,不再需要使用unsafe
或C++来利用这种100%托管/“安全”的内存使用。 - Marc Gravell