C#中的大对象在中等大小集合中

9

我对内存问题还很陌生,希望你不会觉得这是一个愚蠢的问题。

我知道在C#中,大于85,000字节的内存将被放入LOH中,例如:

Byte[] hugeByteCollection = new Byte[85000]; 

我想知道一个包含10个成员变量(字节类型)的对象,大小为10000-20000的集合会被放入LOH还是SOH中?

1个回答

4
对象数组的大小是对象个数乘以指针大小。这是因为只有值类型存储在数组本身中,引用类型(对象)将存储在其他地方,并不会计入数组的大小。因此,在32位和64位模式下,可以在SOH中存储85000/4=21250个对象和85000/8=10625个对象。编辑:感谢Hans Passant指出,这假定使用的集合类型是数组而不是列表。列表调整自身大小以比内容更大,以避免过多分配。有关详细信息,请参见this link

1
那种数学方法不适用于集合类型,实际上是16,384。有关详细信息,请查看此答案:https://dev59.com/EnE95IYBdhLWcg3wlu4g#2248188。 - Hans Passant
谢谢您的评论!您所提到的调整大小仅适用于列表,而不是数组,因此与此问题没有直接关系。但是,我应该添加警告。 - Rasmus Damgaard Nielsen
为了保持包含大量对象的列表在SOH中,我们需要想出一个包含列表数组的分区列表。当列表超过10000的容量时,partitionList将动态创建一个新列表并添加到数组中。这样行得通吗? - cscmh99
会的。但是一旦列表达到那个大小,LOH是更快的选项。我不明白为什么你要坚持将它保留在SOH中? - Rasmus Damgaard Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接