对于网络协议实现,我想利用新的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
是唯一的方式(任何需要{{1}的东西}关键字)这样做。我尝试了一些其他方法,但我无法弄清楚如何使用它们与unsafe
(不能用作泛型类型参数)或如何获取实际缓冲区中的结构而不是副本(任何突变都不会反映在缓冲区中)。
是否有更简单的方法从缓冲区获取这个可变结构?
答案 0 :(得分:2)
OOF。看起来MemoryMarshal.Cast
曾经是NonPortableCast
扩展方法(来自:this commit),在这种情况下 - 是的,这是在跨度布局之间进行thunk的合适方法,最常见的(但不仅限于)在这种情况下 - 在byte
和某些struct
之间。