C#List <char []>是否在连续内存中分配?</char []>

时间:2013-09-08 03:34:44

标签: c#

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

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

2 个答案:

答案 0 :(得分:12)

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

数组是一种引用类型,因此引用List<T>保证的方式存储。但是,数组本身是单独分配的,存储它们与列表无关。它只涉及其元素,参考文献。

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

编辑:根据你的评论:

  

内部数组总是9个字符。

因此,在这种情况下,缓存一致性可能是一个问题,因为子阵列非常小。你会在内存中跳出很多内容,从一个数组到下一个数组,我只会告诉你关于这段代码的性能敏感性。

如果可以,只需使用多维。这当然是假设您知道尺寸或者可以在其上施加最大尺寸。

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

编辑2:

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

预先分配所有内容。你有时间交易一些记忆。 9! * 9 * 2/1024/1024 == ~6.22MB。

正如你所说,无论如何,列表可能会增长到那么大,所以最糟糕的情况是你浪费了几MB的内存。除非你计划在烤箱中运行这些代码,否则我认为这不会成为一个问题。只需将缓冲区预先分配为一个阵列,就可以了。

答案 1 :(得分:5)

List用作dynamic array,而不是链接列表,但这不是重点。在char[] s实例化之前,不会为List分配任何内存。 char[]仅负责保存对char[,] array = new char[x, y]; 的引用,在首次创建时它将不包含引用。

  

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

不,但你可以实例化2-dimensional array个字符,如果你也知道有多少个char数组:

{{1}}