BigArray# 有了块机制之后BigArrayT本身可以保持得很小。它只保存两个东西Copyinternal readonly Array _storage; internal readonly nint _length;普通长度下它会分配一个ElementChunk1T[]布局基本上接近带了一层包装的普通T[]。更大的长度下它会计算块长度分配选中的块数组并把逻辑长度记录为nint。这也是为什么_storage的类型是Array实际运行时类型取决于T。它可能是ElementChunk1T[]也可能是ElementChunk8191T[]或者是ElementChunk3ElementChunk5ElementChunk17ElementChunk257T[]这样的组合块类型。Copypublic BigArray(nint length) { if ((nuint)length (nuint)MaxLength) { ThrowHelpers.ThrowOutOfRange(nameof(length)); } if (length Array.MaxLength) { _storage new ElementChunk1T[length]; } else { _storage CreateBigArraySlow(length); } _length length; }然后是索引器实现。这里我们不需要在每次访问时都除以块大小。底层是一个托管数组数组数据区里连续排列着块结构体而元素又内联保存在这些块里因此代码只需要拿到第一个逻辑T的引用然后用普通的引用偏移往后移动。Copypublic ref T this[nint index] { get { if ((nuint)index (nuint)_length) { ThrowHelpers.ThrowOutOfRange(nameof(index)); } return ref Unsafe.Add(ref GetDataReference(), index); } }这里确实用到了Unsafe但它只藏在实现内部。公开 API 的输入会先被验证然后实现使用引用偏移避免每一次逻辑访问都再走一次普通数组边界检查。如果 index、length 或 slice 超出合法范围会在到达这条路径之前失败。对用户来说公共 API 仍然是安全的对实现来说则可以尽量接近直接数组访问的成本。数据引用是通过把数组数据开头重新解释为T得到的Copyprivate static ref T GetDataReference(Array storage) { return ref Unsafe.Asbyte, T(ref MemoryMarshal.GetArrayDataReference(storage)); }这就是为什么连续存储这个特性很重要。拿到第一个数据引用之后Unsafe.Add(ref first, index)会移动index个逻辑T元素。跨过一个块到下一个块只是在同一段数组数据区里继续往前走。这样一来BigArrayT不需要像交错数组包装器那样在每次访问时都做除法和取余它只是把一个托管数组对象视作一段更大的逻辑序列。最大长度则跟架构有关Copypublic static nint MaxLength nint.Size 4 ? Array.MaxLength : GetChunkLength() * (nint)Array.MaxLength;在 32 位运行时上nint本身无法表示更大的索引空间所以BigArrayT保持普通数组的限制。在 64 位运行时上最大长度会随块大小增长。对byte来说大约是Array.MaxLength * 65535对 64 位运行时上的long或对象引用来说大约是Array.MaxLength * 8191。对于byte这意味着它理论上可以表示接近 128 TiB 的数组准确地说是 127.998 TiB。这里当然说的是理论上限机器仍然需要真的有足够的内存。BigSpan 和 BigMemory#只有持有存储的类型还不够。普通 .NET 代码里数组只是编程模型的一部分。我们还会用SpanT、ReadOnlySpanT、MemoryT和ReadOnlyMemoryT来传递视图。BigSpanT是一个面向超大连续区域的栈上视图Copypublic readonly ref struct BigSpanT { internal readonly ref T _first; internal readonly nint _length; }它的基本形状和SpanT一样一个起始引用加一个长度。不同的是长度是nint索引也使用nint。和SpanT一样它不拥有内存只是查看由别的对象保持存活的内存通常是BigArrayT或BigMemoryT。CopyBigArraybyte buffer new((nint)Array.MaxLength 1024); BigSpanbyte span buffer.AsBigSpan(); span[Array.MaxLength] 42;BigMemoryT和BigReadOnlyMemoryT则是可以保存起来的视图。它们记录底层托管数组、起始偏移和长度Copyinternal readonly Array? _storage; internal readonly nint _start; internal readonly nint _length;当你需要高效的引用访问时它们的Span属性会生成BigSpanT或BigReadOnlySpanT。由于BigMemoryT把底层托管数组保存在_storage里它可以被放进字段或从方法返回同时仍然让这段存储对 GC 可见。CopyBigMemorybyte page buffer.AsBigMemory(1024, 4096); page.Span.Fill(0);API 的设计则尽量沿用了普通 Span/Memory 的习惯切片、复制、搜索、排序、trim、split、ToArray、ToBigArray以及只读转换。实现内部如果需要调用只接受SpanT或ReadOnlySpanT的 BCL API就把数据拆成能放进int的片段来处理。BigSpanT并不指望让所有现有 API 都接受超过int.MaxValue个元素。它给你一个大索引视图并且在需要和现有 API 互操作时允许你取出普通的SpanT片段。Copynint offset (nint)5_000_000_000L; Spanbyte window buffer.AsSpan(offset, length: 4096);分配 API#最简单的分配方式自然是调用构造函数Copynint length (nint)10_000_000_000L; BigArraybyte buffer new(length);不过 .NET 的数组也有显式的 GC 分配辅助方法所以我也提供了对应的 APICopynint length (nint)10_000_000_000L; BigArraybyte zeroed GC.AllocateBigArraybyte(length); BigArraybyte scratch GC.AllocateUninitializedBigArraybyte(length); BigArraybyte pinned GC.AllocateBigArraybyte(length, pinned: true);

相关新闻

最新新闻

Stable Diffusion局部重绘:蒙版法精准控制AI艺术写真创作

Stable Diffusion局部重绘:蒙版法精准控制AI艺术写真创作

1. 项目概述:从“换脸”到“造梦”的AI艺术写真进阶 最近在玩Stable Diffusion的朋友,估计都绕不开一个话题:怎么用AI给自己或者朋友做一套独一无二的艺术写真?一开始,大家可能都停留在“文生图”阶段,输入…

2026/7/7 7:42:17
终极跨平台QSP游戏引擎:免费开源的一站式解决方案

终极跨平台QSP游戏引擎:免费开源的一站式解决方案

终极跨平台QSP游戏引擎:免费开源的一站式解决方案 【免费下载链接】JavaQuestPlayer 项目地址: https://gitcode.com/gh_mirrors/ja/JavaQuestPlayer 你是否曾经想玩一款有趣的QSP游戏,却发现没有合适的播放器?或者想要自己动手制作Q…

2026/7/7 7:42:17
Cookie安全漏洞深度解析:从Secure属性到全栈防御实践

Cookie安全漏洞深度解析:从Secure属性到全栈防御实践

1. 项目概述:一个被忽视的“低级”安全漏洞如果你负责过Web应用的安全加固或渗透测试,大概率在扫描报告里见过“Cookies Not Marked as Secure”这个漏洞。乍一看,它不像SQL注入或XSS那样充满“技术含量”,甚至有些报告会把它归为…

2026/7/7 7:42:17
3大核心技术揭秘:如何用Ryujinx在PC上完美运行Switch游戏

3大核心技术揭秘:如何用Ryujinx在PC上完美运行Switch游戏

3大核心技术揭秘:如何用Ryujinx在PC上完美运行Switch游戏 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾梦想过在个人电脑上体验《塞尔达传说:旷野之息…

2026/7/7 7:42:17
Bedrock Launcher:超越官方启动器的Minecraft基岩版终极管理方案

Bedrock Launcher:超越官方启动器的Minecraft基岩版终极管理方案

Bedrock Launcher:超越官方启动器的Minecraft基岩版终极管理方案 【免费下载链接】BedrockLauncher 项目地址: https://gitcode.com/gh_mirrors/be/BedrockLauncher Bedrock Launcher是一款为Minecraft基岩版设计的专业级启动器,它解决了多版本管…

2026/7/7 7:42:17
ComfyUI整合包+KREA2模型:AI绘画环境一键部署与实战指南

ComfyUI整合包+KREA2模型:AI绘画环境一键部署与实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在为AI绘画的复杂环境配置头疼,特别是想要体验最新的KREA2模型却苦于繁琐的安装过程,那么萝卜大佬的最…

2026/7/7 7:37:16

月新闻