How does StringBuilder's capacity change?

若如初见. 提交于 2019-12-17 16:41:33

问题


When I have an empty StringBuilder with a capacity of 5 and I write "hello, world!" to it, does the C# standard specify the new capacity of the StringBuilder? I have a vague memory that it's twice the new string's length (to avoid changing the capacity with every new appended string).


回答1:


Depends what version of .NET you're talking about. Prior to .NET 4, StringBuilder used the standard .NET strategy, doubling the capacity of the internal buffer every time it needs to be enlarged.

StringBuilder was completely rewritten for .NET 4, now using ropes. Extending the allocation is now done by adding another piece of rope of up to 8000 chars. Not quite as efficient as the earlier strategy but avoids trouble with big buffers clogging up the Large Object Heap. Source code is available from the Reference Source if you want to take a closer look.




回答2:


The C# standard will not specify the behavior of a BCL library class as it has nothing to do with the language specification.

As far as I know the actual behavior is not defined in any specification and is implementation specific.

AFAIK, The MS implementation will double the capacity once the current capacity has been reached.

See this and this previous SO questions.


Update:

This has been changed in .NET 4.0. as described by Hans in his answer. Now ropes are used, adding additional 8000 characters at a time.

MSDN, however is very careful to point out that the actual behavior is implementation specific:

The StringBuilder dynamically allocates more space when required and increases Capacity accordingly. For performance reasons, a StringBuilder might allocate more memory than needed. The amount of memory allocated is implementation-specific.




回答3:


New StringBuilder (.NET 4.5 or higher) allocates an internal buffer m_ChunkChars requested by the capacity parameter:

public StringBuilder(int capacity) { ... m_ChunkChars = new char[capacity]; ... }

So, if capacity is smaller than 40K chars it goes on the Small Object Heap. However (contrary to popular belief), StringBuilder will still allocate on the Large Object Heap if, later, we call sb.Append(...some string larger than 40K chars...); A possible fix can be found here: https://github.com/amikunov/Large-Object-Heap-Fix-For-.NET-String-Builder



来源:https://stackoverflow.com/questions/7547827/how-does-stringbuilders-capacity-change

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!