【发布时间】:2013-09-13 02:58:14
【问题描述】:
我试图了解 C# .NET 4.0 List<T>(initSize) 如何分配内存。
我的问题是我有一个List<foo>,其中foo 类需要至少20 字节的内存。我有两种情况,我最终会得到foo 的X 或X+60 元素。我不知道在分配时会是这两种情况中的哪一种。
由于X 大于36,000 个元素,因此我试图尽量减少不必要的内存分配,如果可以避免的话,我不想为一个List 分配两次。我的理解是分配的大小(36k 个元素 * 4B 参考 ~= 144kB)将分配推到大堆上。更让我烦恼的是,我的 Dictionary<key, List<foo>> 包含大约 4,000 个元素。
我的问题:
C# 运行时是否分配了超出初始指定容量的数量?例如,如果我初始化为 36,000 个条目,我是否真的分配了 65,536 个条目,因为这是 2 的下一个大于 36,000 的幂?
我是否应该在所有情况下都分配给
X+60而不是X以避免第二次分配?在这种情况下,60 恰好是一个不会变化的常数值。
我的问题类似,但与以下不同:
Memory allocation for collections in .NET - 因为他们没有在这个问题中初始化List<T>。
Initial capacity of collection types, e.g. Dictionary, List - 是指定初始容量的实现问题。
How to initialize a List<T> to a given size (as opposed to capacity)? - 似乎在与Array 和List<T> 较量,这不是我的问题。
【问题讨论】:
-
记录在案,LOH 分配的限制为 85000 字节。
-
doubles 除外,其阈值仅为 1000 个元素(8K 字节)
-
好吧,Dictionary 类中有一个不必要的字段没有被使用,因此它增加了一点内存分配
-
@MatthewWatson 更具体地用于双精度数组。
-
每个
foo有多大?如果如@BrianRasmussen 所指出的那样,每个字节都小于 85000 字节,那么它们将不会存储在 LOH 上。我不确定运行时将如何处理 List 本身。它可能最终会出现在 LOH 上。
标签: c# memory-management collections