StringBuilder增长超过85k并转向LOH?

时间:2011-10-03 20:15:43

标签: .net clr large-object-heap

  

可能重复:
  How does StringBuilder's capacity change?

假设分配了一个StringBuilder,然后它增长到超过85k,它会被移到大对象堆上吗?

2 个答案:

答案 0 :(得分:5)

StringBuilder没有“成长”。

在4.0之前的SB中,它只是分配了一个新的更大的缓冲区并将内容从旧的复制到新的。所以最后是的,内部缓冲区被移到了LOH。 SB对象不是,因为它非常小(为了简单起见,它可能只是缓冲区的引用和缓冲区中字符串的长度。它稍微复杂一点,因为它实现了写后复制使用ToString方法。因此ToString方法使缓冲区只读并将其作为字符串返回,并且对SB的任何其他写入都复制缓冲区)。

在4.0中,SB使用类似缓冲区的链接列表(它被称为“绳索”),它们总是足够小,不会去LOH。

答案 1 :(得分:2)

StringBuilder本身不会在LOH上分配,但其内部字符串缓冲区将是。分配器不知道哪些对象正在分配其数据。它只知道大于某个最大大小的分配将转到LOH。