gpt4 book ai didi

c# - StringBuilder 的最大容量

转载 作者:行者123 更新时间:2023-11-30 18:48:29 33 4
gpt4 key购买 nike

为什么这段代码会在 i = 690864192 上抛出 OutOfMemoryException?

StringBuilder sb = new StringBuilder();
for (int i = 0; i < Int32.MaxValue; i++)
{
sb.Append("s");
}
Console.WriteLine(sb.ToString());
Console.Read();

默认容量为 16 个字符,但它会随着需要增加到最大值,即 int.MaxValue = 2,147,483,647。那么为什么当字符数为 690,864,192 远小于最大容量时,会抛出异常?

最佳答案

so basically I don't have enough RAM to store a StringBuilder instance with that many chars?

不不不不不。

RAM 无关;近二十年来,RAM 一直不是内存的相关衡量标准! 虚拟地址空间是相关措施。

令人惊讶的是,相信内存仍然像 1980 年代在 DOS 机器上那样工作的人数。我的建议是了解现代操作系统如何处理内存。 RAM 是一项性能优化。内存是页面文件

这样想。您有一个可以容纳一百万辆汽车(内存页面)的 parking 场(页面文件)。您有一条可容纳十辆汽车的车道 (RAM)。你有一个可以容纳一千个 key 的 key 圈(虚拟内存)。你拥有一千辆汽车。您最常使用的十个在车道上。其他 990 辆在街对面的 parking 场。

当车道空间不足时,只需将其中一辆车移到 parking 场即可。 (RAM 可以快速访问常用页面。)

但是当你购买 1001 号车时,你用完的资源是 key 圈上的空间,而不是 parking 场的房间房间在车道上。您可以随时在车道上腾出更多空间, parking 场也有很多额外空间,但您的 key 圈就这么大了。

Why is it when number of chars is 690,864,192 which is much less than the max capacity, does it throw an exception?

在 32 位 Windows 机器上,每个进程只能获得 2 GB 的用户可寻址虚拟地址空间。

在每个字符两个字节的情况下,6.9 亿个字符是 14 亿字节,这是 2GB 地址空间的巨大部分。您只剩下大约 0.6 GB 的空间来容纳过程中的所有其他内容。在某些时候,字符串生成器将需要分配另一个 block ,而您的地址空间中的任何地方都没有该大小的空闲 block ,因此分配失败。

您最初为什么要尝试这样做?一个 14 亿字节的字符串是完全荒谬的。

关于c# - StringBuilder 的最大容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20672920/

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