1

在 .net 4.5 中,CLR 团队有StringBuilder很多变化。StringBuilder类的代码参考。在这里,我们可以找到MaxChunkSize等于 8000 并在此字段上方进行注释:

// We want to keep chunk arrays out of large object heap (< 85K bytes ~ 40K chars) to be sure.
// Making the maximum chunk size big means less allocation code called, but also more waste
// in unused characters and slower inserts / replaces (since you do need to slide characters over
// within a buffer).  

所以我仍然想知道,我们是否会使用StringBuilder附加大字符串,例如:

var sb = new StringBuilder();
sb.Append(<<Here comes the string with length larger than 80 000 symbols>>);

我们还会在 LargeObjectHeap 中分配 ChunksArrays 吗?

4

2 回答 2

0

我的直觉告诉你,你仍然会因为大弦本身而被 LOH 标记。如果您的字符串大于限制,它仍然会存在于 LOH 中,尽管StringBuilder不会。

让我们测试一下:

void Main()
{
    var big_ass_string = new String('a', 80001);
    var sb = new StringBuilder();
    sb.Append(big_ass_string);
    var generation_of_builder = GC.GetGeneration(sb);
    var generation_of_string = GC.GetGeneration(big_ass_string);
    Console.WriteLine("StringBuilder is in gen:{0}", generation_of_builder);
    Console.WriteLine("String is in gen:{0}", generation_of_string);
}

输出:

StringBuilder is in gen:0
String is in gen:2
于 2014-10-17T15:17:57.083 回答
-1

答案是肯定的(即使在 .NET 4.5 或更高版本中):每次调用sb.Append(...some string larger than 40K chars...);StringBuilder 时都会在大对象堆上分配。(因此,违背了 StringBuilder 的“新”设计的目的。)我在此处发布了更详细的信息和可能的修复方法: https://github.com/amikunov/Large-Object-Heap-Fix-For-。 NET 字符串生成器

于 2017-05-18T20:21:55.960 回答