1

可能重复:
StringBuilder 的容量如何变化?

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

4

2 回答 2

5

StringBuilder不会“成长”。

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

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

于 2011-10-03T20:18:20.443 回答
2

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

于 2011-10-03T20:19:31.213 回答