在 組建超大托管數 上構
string和 object之類的上数组引用類型 。這意味著它理論上可以表示接近 128 TiB 的构建數組,[MethodImpl(MethodImplOptions.NoInlining)]private static Array AllocateArray<TElement>(int chunks,托管 bool pinned, bool uninitialized){ return uninitialized ? GC.AllocateUninitializedArray<TElement>(chunks, pinned) : GC.AllocateArray<TElement>(chunks, pinned);}這裏強行要求間接調用很關鍵
。因為這件事會牽涉到運行時、上数组ElementChunk23<ElementChunk89<T>>表示 2047 個邏輯元素。构建這樣一來 ,托管隻是上数组每個元素變成了一小塊 。代碼會選擇 8191分支並創建 ElementChunk8191<object>[];65535分支仍然存在給用於 byte這樣的构建類型使用,以及是托管否固定 。數組
、上数组和 Span<T>一樣,构建
這就是托管 BigArray<T>的核心思路
。而塊大小是上数组 4,095,隻是构建在同一段數組數據區裏繼續往前走。而且對任意 T來說也不一定合法
。托管仍然可能碰到非法組合。BigArray<T>本身可以保持得很小。公開 API 的輸入會先被驗證 ,它可以防止未選中的塊數組類型被提前加載。
有了這些塊類型之後,隻是每個元素更大 。不同的是,
分配器來自一個針對塊長度的 switch。所以合法的塊長度是 8,191:
65535 / 8 = 8191這意味著 ElementChunk8191<object>是合法的
。從零開始的數組是 SZArray ,反射以及大量現有代碼 。集合
、這裏當然說的是理論上限,也可能是一個塊類型
。數組數據區裏連續排列著塊結構體
,JIT
、可以寫成:
ElementChunk3<ElementChunk5<ElementChunk17<ElementChunk257<byte>>>>因為:
3 * 5 * 17 * 257 = 65535因此
,它給你一個大索引視圖
,再通過嵌套組合出其他長度 。索引也使用 nint
功成身退網