C# 列表<字符[]>是否在连续内存中分配

本文关键字:连续 内存 分配 是否 列表 字符 | 更新日期: 2023-09-27 18:30:37

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

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

C# 列表<字符[]>是否在连续内存中分配

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

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

如果需要,则只需使用一个大型数组并维护边界数据。

编辑:根据您的评论:

内部数组始终为 9 个字符。

因此,在这种情况下,缓存一致性可能是一个问题,因为子数组非常小。 从一个数组到下一个数组,您将在内存中跳来跳去,我将带您了解此代码的性能敏感性。

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

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

编辑2:

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

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

正如您所说,列表无论如何都可能会增长到该大小,因此最坏的情况是您浪费几 MB 的内存。 我认为这不会成为问题,除非您打算在烤面包机烤箱中运行此代码。 只需预先将缓冲区分配为一个数组即可。

List充当

动态数组,而不是链表,但这无关紧要。在实例化char[]之前,不会为它们分配内存。List仅负责保存对char[]的引用,首次创建时不包含任何引用。

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

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

char[,] array = new char[x, y];