假设分配了一个StringBuilder,然后它增长到超过85k,它会被移到大对象堆上吗?
答案 0 :(得分:5)
StringBuilder
没有“成长”。
在4.0之前的SB中,它只是分配了一个新的更大的缓冲区并将内容从旧的复制到新的。所以最后是的,内部缓冲区被移到了LOH。 SB对象不是,因为它非常小(为了简单起见,它可能只是缓冲区的引用和缓冲区中字符串的长度。它稍微复杂一点,因为它实现了写后复制使用ToString
方法。因此ToString
方法使缓冲区只读并将其作为字符串返回,并且对SB的任何其他写入都复制缓冲区)。
在4.0中,SB使用类似缓冲区的链接列表(它被称为“绳索”),它们总是足够小,不会去LOH。
答案 1 :(得分:2)
StringBuilder
本身不会在LOH上分配,但其内部字符串缓冲区将是。分配器不知道哪些对象正在分配其数据。它只知道大于某个最大大小的分配将转到LOH。