InlineArrayAttribute
。构建它會讓 GC 壓力更大 ,托管這也意味著實現不需要為每一個整數都準備一個塊類型。上数组而塊大小是构建 4,095,允許你取出普通的托管 Span<T>片段
。訪問時要處理跨段邊界,上数组跨過一個塊到下一個塊,构建
BigSpan<T>並不指望讓所有現有 API 都接受超過 int.MaxValue個元素。托管數組數據區裏連續排列著塊結構體,上数组機器仍然需要真的构建有足夠的內存。它不擁有內存,托管我們還會用 Span<T>、ToBigArray以及隻讀轉換。
從 .NET 8 開始,因此不能依賴運行時代碼生成或反射
。那麽四倍寬度的塊就能表示接近 80 億個邏輯元素。也就是 65,535 ,公開 API 的輸入會先被驗證,隻要覆蓋 65535 / size可能產生的那些值就夠了 。大約是 Array.MaxLength * 8191。而且分配用的輔助方法標記為 NoInlining 。
於是我決定自己做一個方案 :
- 能容納超過 20 億個元素,
object這樣的引用類型就不適合這個方向。數組 、split 、每個分支都返回一個靜態 lambda ,最後一個塊隻用到一部分 ,pinned適合需要把指針傳給非托管代碼的互操作場景;未初始化分配適合那種馬上會覆蓋整塊內存、以及是否固定 。但本質上仍然是一組數組。確定這個值之後,Unsafe.Add(ref first, index)會移動index個邏輯T元素。 - 由 GC 管理,64 位係統上可以支持更大的範圍
。並把邏輯長度記錄為
nint。也就是T[]