如果我声明了一个char数组列表,它们是在连续的内存中分配的,还是.NET创建一个链表呢?
如果它不连续,有没有办法可以声明一个连续的char数组列表? char数组的大小是提前知道的并且是固定的(它们都是相同的大小)。
答案 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}}