如果我声明一个 char 数组列表,它们是在连续内存中分配的,还是 .NET 会创建一个链表?
如果它不连续,有没有办法可以声明一个连续的 char 数组列表?char 数组的大小是提前知道的并且是固定的(它们都是相同的大小)。
如果我声明一个 char 数组列表,它们是在连续内存中分配的,还是 .NET 会创建一个链表?
如果它不连续,有没有办法可以声明一个连续的 char 数组列表?char 数组的大小是提前知道的并且是固定的(它们都是相同的大小)。
是的,但不是你想要的方式。List<T>
保证其元素连续存储。
数组是一种引用类型,因此引用List<T>
作为保证被连续存储。但是,数组本身是单独分配的,它们的存储位置与列表无关。它只关心它的元素,即引用。
如果您需要,那么您应该简单地使用一个大数组并维护边界数据。
编辑:根据您的评论:
内部数组总是 9 个字符。
因此,在这种情况下,缓存一致性可能是一个问题,因为子阵列非常小。从一个数组到下一个数组,您会在内存中跳来跳去,我将就这段代码的性能敏感性向您保证。
如果可以的话,只需使用多维。这当然假设您知道大小或者您可以对其施加最大大小。
是否可以交换一些内存以降低复杂性/时间并仅为 设置最大大小N
?使用多维数组(但不要使用后者)是保证连续分配的唯一方法。
编辑2:
试图使答案与评论保持同步。你说第一维的最大尺寸是9!和以前一样,第二维的大小是 9。
预先分配它。你正在用一些记忆换取时间。9!* 9 * 2 / 1024 / 1024 == ~6.22MB。
正如你所说,列表可能会增长到那个大小,所以最坏的情况是你浪费了几 MB 的内存。除非您打算在烤箱中运行此代码,否则我认为这不会成为问题。只需预先将缓冲区分配为一个数组,就可以了。