我正在研究返回的最佳方式' views
' 放入一个非常大的数组中,发现 ArraySegment
这完全符合我的需求。然而,我随后发现 Memory<T>
这似乎表现得一样,除了需要一个跨度来查看内存。
对于创建 View 并将其写入大型 (2GB+) 数组的用例,使用哪个有关系吗?
大数组的原因是它们保存图像的字节。
最佳答案
内存有点像 Span 的包装器——一个不必在堆栈上的包装器。正如 CoolBots 提供的链接所指出的那样,它是对数组和数组段的补充,并不是真正的替代品。
您要考虑使用 Span/Memory 的主要原因是性能和灵活性。 Span 使您可以直接访问内存,而不是将其来回复制到数组,并且允许您以灵活的方式处理内存。下面我将从将数组用作字节到将其用作 uint 数组。
我将直接跳到 Span,但您可以改用 AsMemory,这样您就可以更轻松地传递它。但它仍然归结为从内存中获取跨度。
下面是一个例子:
const int dataSize = 512;
const int segSize = 256;
byte[] rawdata = new byte[dataSize];
var segment = new ArraySegment<byte>(rawdata, segSize, segSize);
var seg1 = segment.AsSpan();
var seg1Uint = MemoryMarshal.Cast<byte, uint>(seg1);
for (int i = 0; i < segSize / sizeof(uint); ++i)
{
ref var data = ref seg1Uint[i];
data = 0x000066;
}
foreach (var b in rawdata)
Console.WriteLine(b);
关于c# - 何时使用 ArraySegment<T> 而不是 Memory<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52224702/