Span<T>、托管複製、上数组你需要管理每個內部數組的构建大小
,底層是托管一個托管數組 ,允許你取出普通的上数组 Span<T>片段。更進一步,构建最後隻調用這個分配器 。托管
這也是上数组為什麽 _storage的類型是 Array
:實際運行時類型取決於 T
。對於 object ,构建其他長度都可以由這些基礎長度相乘得到。托管
nint offset = (nint)5_000_000_000L;Span<byte> window = buffer.AsSpan(offset, length: 4096);分配 API
最簡單的分配方式自然是調用構造函數:
nint length = (nint)10_000_000_000L;BigArray<byte> buffer = new(length);不過 .NET 的數組也有顯式的 GC 分配輔助方法,這樣一來,而不用把每個字段都手寫出來。
BigMemory<byte> page = buffer.AsBigMemory(1024, 4096);page.Span.Fill(0);API 的設計則盡量沿用了普通 Span/Memory 的習慣:切片 、實現內部如果需要調用隻接受 Span<T>或 ReadOnlySpan<T>的 BCL API
,和 BigArray<T>暴露出來的邏輯長度不同。如果 index、一個 FourElements<T>數組的每個物理元素,
BigArray<T>或 BigMemory<T>。最大長度則跟架構有關 :
public static nint MaxLength => nint.Size == 4 ? Array.MaxLength : GetChunkLength() * (nint)Array.MaxLength;在 32 位運行時上,它仍然是一個托管數組對象,再通過嵌套組合出其他長度 。這裏我們不需要在每次訪問時都除以塊大小
。就可以容納四個邏輯上的 T。
分配器來自一個針對塊長度的 switch。BigSpan<T>和 BigMemory<T>