第一件事:
我知道什么
Span<T>
和Memory<T>
是什么我知道为什么
Span<T>
必须只驻留在堆栈上我(概念上)知道什么是结构撕裂
我还不清楚的是:结构撕裂不是问题Memory<T>
吗?据我了解,基本上所有大于 WORD 大小的类型都可以/将受此影响。更进一步,当这种类型可以在多线程读写器场景中使用时,它可能会导致竞争条件,如下面的链接所述。
直截了当地说:这个例子在Memory<T>
使用而不是Span<T>
:
internal class Buffer {
Memory<byte> _memory = new byte[1024];
public void Resize(int newSize) {
_memory = new byte[newSize]; // Will this update atomically?
}
public byte this[int index] => _memory.Span[index]; // Won't this also possibly see partial update?
}
根据CoreFX 的实现, Memory<T>
还依次布置了一个(托管对象)引用、它的长度和一个索引。Span<T>
我失踪的区别在哪里,Memory<T>
适合那些场景?