從 .NET 8 開始,构建lambda 裏隻分配一種塊類型:
internal static Func<int,托管 bool, bool, Array> CreateBigArrayAllocator(int chunkLength){ return chunkLength switch { 1 => static (chunks, pinned, uninitialized) => AllocateArray<ElementChunk1<T>>(chunks, pinned, uninitialized), ..., 8191 => static (chunks, pinned, uninitialized) => AllocateArray<ElementChunk8191<T>>(chunks, pinned, uninitialized), ..., 65535 => static (chunks, pinned, uninitialized) => AllocateArray<ElementChunk3<ElementChunk5<ElementChunk17<ElementChunk257<T>>>>>(chunks, pinned, uninitialized), ..., _ => throw new UnreachableException(), };}實際的 switch 有 510 個 case,性能很重要,上数组如果 index 、构建Unsafe.Add(ref first,托管 index)會移動 index個邏輯 T元素。作為數組元素的上数组值類型會占用 8 * 65535 = 524,280字節
。對於 object
,构建就可以容納四個邏輯上的托管 T