11

如果我声明一个 char 数组列表,它们是在连续内存中分配的,还是 .NET 会创建一个链表?

如果它不连续,有没有办法可以声明一个连续的 char 数组列表?char 数组的大小是提前知道的并且是固定的(它们都是相同的大小)。

4

2 回答 2

12

是的,但不是你想要的方式。List<T>保证其元素连续存储。

数组是一种引用类型,因此引用List<T>作为保证被连续存储。但是,数组本身是单独分配的,它们的存储位置与列表无关。它只关心它的元素,即引用。

如果您需要,那么您应该简单地使用一个大数组并维护边界数据。

编辑:根据您的评论:

内部数组总是 9 个字符。

因此,在这种情况下,缓存一致性可能是一个问题,因为子阵列非常小。从一个数组到下一个数组,您会在内存中跳来跳去,我将就这段代码的性能敏感性向您保证。

如果可以的话,只需使用多维。这当然假设您知道大小或者您可以对其施加最大大小。

是否可以交换一些内存以降低复杂性/时间并仅为 设置最大大小N?使用多维数组(但不要使用后者)是保证连续分配的唯一方法。

编辑2:

试图使答案与评论保持同步。你说第一维的最大尺寸是9!和以前一样,第二维的大小是 9。

预先分配它。你正在用一些记忆换取时间。9!* 9 * 2 / 1024 / 1024 == ~6.22MB。

正如你所说,列表可能会增长到那个大小,所以最坏的情况是你浪费了几 MB 的内存。除非您打算在烤箱中运行此代码,否则我认为这不会成为问题。只需预先将缓冲区分配为一个数组,就可以了。

于 2013-09-08T03:38:37.997 回答
5

List用作动态数组,而不是链表,但这是题外话。char[]在实例化它们之前,不会为 s 分配内存。TheList仅负责保存对char[]s 的引用,在第一次创建时它将不包含任何引用。

如果它不连续,有没有办法可以声明一个连续的 char 数组列表?char 数组的大小是提前知道的并且是固定的(它们都是相同的大小)。

不,但你可以实例化一个二维的字符数组,如果你也知道有多少个字符数组:

char[,] array = new char[x, y];
于 2013-09-08T03:37:26.197 回答