2015-09-05 49 views
9

我对内存问题很陌生。希望你不要以为这是一个愚蠢的问题。C#中等大小集合中的大对象

我知道,内存更大的超过85000个字节会在C#中被放入蕙 即

Byte[] hugeByteCollection = new Byte[85000]; 

我不知道是否有大小10000集 - 20000与包含10个成员变量的对象(字节类型)将被放入LOH还是SOH?

回答

4

对象数组的大小是指针大小乘以对象的数量。这是因为只有值类型存储在数组本身中,引用类型(对象)将被存储在其他地方并且不会计入数组的大小。因此,85000/4 = 21250个对象和85000/8 = 10625个对象可以分别存储在32位和64位模式的SOH阵列中。

编辑: 感谢Hans Passant指出,这假定所使用的集合类型是一个数组而不是一个列表。为了避免太多的分配,列表将自己调整大于内容。有关详细信息,请参见this link

+1

这种数学算法对收集类型不起作用,实际上是16,384。查看[这个答案](http://stackoverflow.com/a/2248188/17034)了解详情。 –

+0

感谢您的评论!你所说的调整大小只适用于列表,而不是数组,因此与这个问题没有直接关系。但是,我仍然应该添加警告 –

+0

,以便将包含大量对象的列表保留在SOH中 我们需要提出一个包含列表数组的分区列表。 partitionList将动态创建一个新的列表并添加到arry当列表超过10000的容量时 这是否会工作? – cscmh99