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

时间:2010-12-21 02:41:06

标签: c# clr

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

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

现在sb的容量是什么?为什么?乘数是多少?

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

谢谢!

2 个答案:

答案 0 :(得分:8)

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

  • 如果加倍不够,那么容量会进一步增加到所需的确切数量。
  • 有一个上限 - 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;
}

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

答案 1 :(得分:0)

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

相关问题