开发者

How does StringBuilder's capacity change?

开发者 https://www.devze.com 2023-04-07 03:50 出处:网络
When I have an empty StringBuilder with a capacity of 5 and I writ开发者_Python百科e \"hello, world!\" to it, does the C# standard specify the new capacity of the StringBuilder? I have a vague memory

When I have an empty StringBuilder with a capacity of 5 and I writ开发者_Python百科e "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).


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.


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.


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

0

精彩评论

暂无评论...
验证码 换一张
取 消