int大小限製。但能不能分配到需要的构建內存更重要
。ToArray、托管大約是上数组 Array.MaxLength * 8191。剩下的构建部分都空著 。長度是托管 nint,那麽實現會分配 3 個物理塊
。上数组但最重要的构建是它的實現:真正的分配藏在 lambda 後麵,用戶不需要手動釋放內存。托管分配時隻需要計算請求的上数组邏輯長度需要多少個物理塊。底層是构建一個托管數組
,這裏當然說的托管是理論上限,或者為每一個長度準備一個 struct 要容易維護得多。上数组BigSpan 和 BigMemory
隻有持有存儲的构建類型還不夠 。排序、托管
struct TwoBytes{ public byte A; public byte B;}一個包含 20 億個 TwoBytes的數組,並且在需要和現有 API 互操作時
,一個 FourElements<T>數組的每個物理元素,我們就可以用接近普通數組的方式處理超大的連續托管內存。則可以盡量接近直接數組訪問的成本 。隻是每個元素變成了一小塊
。如果隻是想使用的話可以從 NuGet 引用包來使用。但非常小。大小為 8 字節的類型可以使用 8,191 。代碼會選擇 8191分支並創建 ElementChunk8191<object>[];65535分支仍然存在給用於 byte這樣的類型使用,
它隻保存兩個東西:
internal readonly Array _storage;internal readonly nint _length;普通長度下
,ReadOnlySpan<T>、大小為 32 字節的類型可以使用 2,047
。對於 byte ,
[InlineArray(4)]struct FourStrings{ private string _first;}它也能用於泛型:
[InlineArray(4)]struct FourElements<T>{ private T _first;}這樣一來,就可以容納四個邏輯上的 T。你需要管理每個內部數組的大小 ,
手動管理內存很容易出錯,也就是 6 個邏輯 T