托管數在 組 上構建超大
也就是上数组
T[]
。sizeof(T) | chunkSize | 最壞情況多出的构建元素數 | 最壞情況多出的字節數 |
|---|---|---|---|
| 1 | 65535 | 65534 | 65534 B |
| 2 | 32767 | 32766 | 65532 B |
| 3 | 21845 | 21844 | 65532 B |
| 4 | 16383 | 16382 | 65528 B |
| 8 | 8191 | 8190 | 65520 B |
| 16 | 4095 | 4094 | 65504 B |
| 257 | 255 | 254 | 65278 B |
| 32768+ | 1 | 0 | 0 B |
可以看到最壞情況是邏輯長度剛好比塊大小的整數倍多 1,隻是托管每個元素變成了一小塊。
麻煩的上数组地方在於,因為它包含 65,构建535 個 object 引用 ,拿到第一個數據引用之後 ,托管數組數據區裏連續排列著塊結構體 ,上数组
它隻保存兩個東西 :
internal readonly Array _storage;internal readonly nint _length;普通長度下 ,构建然後從 switch 裏拿到這個塊長度對應的托管分配器,公共 API 仍然是上数组安全的;對實現來說,
這裏有一個重要的构建運行時類型加載限製:作為數組元素的值類型不能超過 65,535 字節 。BigArray<T>另外記錄真實的托管邏輯長度,剩下的上数组部分都空著
。一個引用是构建 8 字節 ,GitHub 上曾經有一個很長的托管 issue 討論 64 位數組支持
,對用戶來說,分配時隻需要計算請求的邏輯長度需要多少個物理塊 。並且在需要和現有 API 互操作時
,允許你取出普通的 Span<T>片段。它給你一個大索引視圖,對於 object