我试图了解 C# .NET 4.0 如何List<T>(initSize)
分配内存。
我的问题是我有一个List<foo>
where 类foo
需要至少 20 字节的内存。我有两种情况,我最终X
会X+60
拥有foo
. 我不知道在分配时会是这两种情况中的哪一种。
由于大于 36,000 个元素,因此我试图尽量减少不必要的内存分配,如果可以避免的话X
,我不想为一个分配两次。List
我的理解是分配的大小(36k 个元素 * 4B 参考 ~= 144kB)将分配推到大堆上。更让我烦恼的是,我有一个Dictionary<key, List<foo>>
大约 4,000 个元素。
我的问题:
C# 运行时是否分配了超出初始指定容量的数量?例如,如果我初始化为 36,000 个条目,我是否真的分配了 65,536 个条目,因为这是 2 的下一个大于 36,000 的幂?
我应该
X+60
在所有情况下都分配给而不是X
避免第二次分配吗?在这种情况下,60 恰好是一个不会变化的常数值。
我的问题类似,但与以下问题不同:
.NET 中集合的内存分配 - 因为它们没有List<T>
在这个问题中初始化。
集合类型的初始容量,例如字典、列表 - 是指定初始容量的实现问题。
如何将 List<T> 初始化为给定大小(而不是容量)?- 似乎正在与Array
vs搏斗List<T>
,这不是我的问题。