C# · 12月 29, 2021

C#列表是否分配在连续的内存中?

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

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

解决方法 是的,但不是你想要的方式.列表与LT; T>保证其元素连续存储.

数组是一个参考类型,因此引用被一致地存储为List< T>担保.但是,数组本身分开分配,存储在哪里与列表无关.它只关心其元素,参考.

如果您需要,那么您应该简单地使用一个大阵列并保留边界数据.

编辑:根据您的意见:

The inner arrays are always 9 chars.

因此,在这种情况下,高速缓存一致性可能是一个问题,因为子阵列很小.你将会从一个阵列到另一个阵列的内存中跳跃很多,我​​只想介绍一下这个代码的性能敏感性.

只要使用多维即可.这当然假定你知道大小,或者你可以强加一个最大的大小.

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

编辑2:

试图让答案与评论同步.你说第一维的最大尺寸是9!如前所述,第二维度的大小为9.

把它全部分配在前面.你正在交易一些记忆. 9! * 9 * 2/1024/1024 ==〜6.22MB.

正如你所说,列表可能会增长到那个大小,所以最坏的情况下,你浪费了几MB的内存.我不认为这是一个问题,除非你打算在烤面包机上运行这个代码.只需将缓冲区分配为一个阵列,您就可以.