我知道当一个StringBuilder对象已经达到容量限制时,使用sb.Append(..)将会分配更多的内存。但是容量会增加多少呢?
StringBuilder sb = new StringBuilder(5);
sb.Append("0123456789");
现在,什么是sb的容量以及为什么?什么是乘数?
只是为了清晰明了。我问的是容量而不是长度。
谢谢!
除了某些特殊情况外,容量每次翻倍:
您可以使用.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²)时间。