C# 查找Span的位置<;T>;排列

C# 查找Span的位置<;T>;排列,c#,performance,system.memory,C#,Performance,System.memory,Span指向内存区域。假设我知道它是什么内存区域(即数组),我能(有效地)计算出它指向数组中的第一个元素吗?我想,因为它指向非固定内存,所以这个信息必须存储在某个地方,因为地址必须由GC更新 var buffer = new byte[100]; var span = new Span<byte>(buffer); span = span.Slice(10, 5); // How can I figure out where in buffer this span starts?

Span指向内存区域。假设我知道它是什么内存区域(即数组),我能(有效地)计算出它指向数组中的第一个元素吗?我想,因为它指向非固定内存,所以这个信息必须存储在某个地方,因为地址必须由GC更新

var buffer = new byte[100];
var span = new Span<byte>(buffer);
span = span.Slice(10, 5);
// How can I figure out where in buffer this span starts?
var buffer=新字节[100];
var span=新的span(缓冲区);
span=span.切片(10,5);
//我怎样才能知道这个跨度从缓冲区的什么地方开始?

可能使用
MemoryExtensions
中的方法?否,IndexOf用于搜索内容。Span可以是1字节,缓冲区可以是100MB,所以来自IndexOf的信息不会告诉我任何有用的东西。我可以使用IndexOf和索引所有点击,更改span的第一个值,并检查所有点击中更改的那个。但这是一种有点低效的方法,而且违背了Span的全部目的P
int-elementOffsetOf(Span Span,T[]array)=>(int)不安全。字节偏移量(ref-array[0],ref-Span[0])/Unsafe.SizeOf()
可以做到这一点(这可能成为
T[]
的(
internal
!)扩展方法)。我不确定有没有更优雅的方式。请注意,如果不传递实际指向
数组的元素的
span
,则会产生垃圾;确保这种情况是你自己的责任,尽管可以增加检查(但要付出一定的代价)。