StringBuilder如何决定其容量应该有多大?

我知道当sb已经处于容量状态时,当你使用sb.Append(..)时,StringBuilder对象会分配更多的内存。 但是这个容量增加了多少?

StringBuilder sb = new StringBuilder(5); sb.Append("0123456789"); 

现在,某人的能力是什么?为什么? 乘数是多少?

为了清楚起见。 我问的是容量而不是长度。

谢谢!

除了一些特殊情况,每次容量增加一倍:

  • 如果加倍不够,则容量进一步增加到所需的精确量。
  • 有一个上限 – 0x7fffffff。

您可以使用.NET Reflector或下载参考源来查看算法。

我不能发布官方.NET实现的源代码,但这里是Mono实现的代码:

 // Try double buffer, if that doesn't work, set the length as capacity if (size > capacity) { // The first time a string is appended, we just set _cached_str // and _str to it. This allows us to do some optimizations. // Below, we take this into account. if ((object) _cached_str == (object) _str && capacity < constDefaultCapacity) capacity = constDefaultCapacity; capacity = capacity << 1; // This means "capacity *= 2;" if (size > capacity) capacity = size; if (capacity >= Int32.MaxValue || capacity < 0) capacity = Int32.MaxValue; if (capacity > _maxCapacity && size <= _maxCapacity) capacity = _maxCapacity; } 

我还建议您不要编写依赖于此特定算法的代码,因为它是一个实现细节,而不是接口保证的东西。

这是指数增长(具体来说,每次重新分配加倍),以便允许一系列追加采用O(N)时间而不是O(N²)时间。