gpt4 book ai didi

c# - 字符串生成器的内存分配。内存中发生了什么? StringBuilder 与字符串

转载 作者:太空狗 更新时间:2023-10-29 21:32:41 25 4
gpt4 key购买 nike

可能是重复的,因为关于这个主题有很多问题,但我找不到我要找的东西。

我知道 String 是不可变的而 StringBuilder 是可变的。我理解这两个术语的本质。我想知道当我创建一个 StringBuilder 的实例时,内存中到底发生了什么。喜欢:

StringBuilder s = new StringBuilder();
  1. 在内存中为s预留了多少空间?
  2. 我可以像 s[0] = 'a'; 这样使用它,所以我们可以将 s 称为数组吗?
  3. 如果 s 是基于索引的,是否意味着字符存储在内存中的连续位置?
  4. 如果对 3 的回答是肯定的。那么如果我们使用 s.Append("abc"); 并且内存中没有足够的连续空间用于 "abc" 会发生什么?每次我们将某些内容附加到 string 类型变量时,它是否会将 s 带到一个新的内存位置,就像 string 发生的情况一样?

最佳答案

StringBuilder 实际上是一个 StringBuilder 链(将它们想象成链接的内存块)。用户显然是在与一个 StringBuilder 进行交互,但这远非如此。

每个 StringBuilder 使用底层 char 数组,当容量耗尽时,新的 StringBuilder 将被添加到链中。

记住这一点,您的具体问题的答案是:

  1. 检查实现以查看 StringBuilder 的默认容量是多少,因此它的底层数组是多少。您还可以使用构造函数重载来指定它以满足您的特定需求。
  2. 是的,StringBuilder 在内部使用数组,但链中的每个构建器都有自己的数组。
  3. 是和不是。链中每个内部构建器数组的内存是连续分配的,但不同的内存块不需要而且很可能不会连续分配。
  4. 当没有足够的空间时, StringBuilder 被添加到链中,并在运行时认为合适的地方分配其对应的数组;通常,新构建器至少会使 StringBuilder 的总容量增加一倍,并且新数组很可能不会连续分配给前一个数组。

显然,该系统允许动态调整大小,同时避免了与调整数组大小和来回复制数据相关的成本。

关于c# - 字符串生成器的内存分配。内存中发生了什么? StringBuilder 与字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37185068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com