当我有一个容量为5的空StringBuilder
时,我写了“你好,世界!”对它来说,C#标准是否指定了StringBuilder
的新容量?我有一个模糊的记忆,它是新字符串长度的两倍(以避免每个新附加字符串改变容量)。
答案 0 :(得分:15)
取决于您正在谈论的.NET版本。在.NET 4之前,StringBuilder使用standard .NET strategy,每次需要放大时内部缓冲区的容量加倍。
StringBuilder完全被重写为.NET 4,现在使用ropes。现在通过添加另一条最多8000个字符的绳索来扩展分配。不像早期的策略那么有效,但避免了大缓冲区堵塞大对象堆的麻烦。如果您想仔细查看,可以从参考源获取源代码。
答案 1 :(得分:5)
C#标准不会指定BCL库类的行为,因为它与语言规范无关。
据我所知,实际行为未在任何规范中定义,并且是特定于实现的。
AFAIK,一旦达到当前容量,MS实施将使容量翻倍。
更新
在.NET 4.0中已经更改了。正如Hans中his answer所述。现在使用ropes,一次添加额外的8000个字符。
MSDN但是要非常小心地指出实际行为是特定于实现的:
StringBuilder在需要时动态分配更多空间,并相应地增加容量。出于性能原因,StringBuilder可能会分配比所需更多的内存。分配的内存量是特定于实现的。
答案 2 :(得分:-1)
新的StringBuilder(.NET 4.5或更高版本)分配容量参数请求的内部缓冲区m_ChunkChars
:
public StringBuilder(int capacity)
{
...
m_ChunkChars = new char[capacity];
...
}
因此,如果容量小于40K字符,它将继续小对象堆。但是(与流行的看法相反),如果稍后我们调用sb.Append(...some string larger than 40K chars...);
,StringBuilder仍会在大对象堆上进行分配。可以在此处找到可能的修复:
https://github.com/amikunov/Large-Object-Heap-Fix-For-.NET-String-Builder