gpt4 book ai didi

c# - 在 .NET 中的 CLR 上下文中,堆栈空间是如何分配的

转载 作者:行者123 更新时间:2023-11-30 21:15:00 30 4
gpt4 key购买 nike

在 .NET 中的 CLR 上下文中,堆栈空间是如何分配的,它通常受什么限制?

例如:

任何给定的线程能否继续添加到堆栈直到内存耗尽?如果不; CLR 如何决定分配多少空间,它可以改变主意吗?

PS:为了说明一些背景,这一切都始于关于如何构建一种计算斐波那契数列的方法的讨论,其中一个建议是递归函数。

最佳答案

CLR 会立即为每个线程提交完整的堆栈空间,一旦它被创建。默认堆栈大小为 1MB。如果您将堆栈插入超过该大小,则会出现堆栈溢出并引发错误。

CLR 采用与 native 代码不同的策略, native 代码仅保留 1MB,但按需提交。

这些是实现细节。最好将堆栈简单地视为固定大小的数据结构。此 View 适用于 .net 和 native 堆栈实现。

递归函数绝对是计算斐波那契数列最差的方法,因为它的复杂度是指数级的。相反,您应该使用时间线性且空间恒定的迭代算法。例如:

static int fib(int n)
{
int result = 0;
int a = 1;
for (int i=1; i<=n; i++)
{
int temp = result;
result = a;
a = temp + a;
}
return result;
}

当然,实际上,您会在达到堆栈溢出之前很久就溢出您的结果变量。但是对于 30-40 范围内的 n 值,递归算法的性能是站不住脚的。

另一种明智的方法是用预先计算的值填充静态数组。同样,由于值增长如此之快,您不需要非常大的数组来包含适合 int 甚至 long 的所有值。

关于c# - 在 .NET 中的 CLR 上下文中,堆栈空间是如何分配的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5974643/

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