C# 在.NET中的CLR上下文中,堆栈空间是如何分配的
在.NET中的CLR上下文中,堆栈空间是如何分配的,它通常受到什么限制 例如: 任何给定的线程是否可以继续添加到堆栈中,直到内存耗尽?若否,;CLR如何决定分配多少空间?它能改变主意吗C# 在.NET中的CLR上下文中,堆栈空间是如何分配的,c#,vb.net,memory-management,stack,stack-overflow,C#,Vb.net,Memory Management,Stack,Stack Overflow,在.NET中的CLR上下文中,堆栈空间是如何分配的,它通常受到什么限制 例如: 任何给定的线程是否可以继续添加到堆栈中,直到内存耗尽?若否,;CLR如何决定分配多少空间?它能改变主意吗 PS:这一切都是从讨论如何构建一个计算斐波那契序列的方法开始的,其中一个建议是递归函数。CLR会在每个线程创建后立即提交完整的堆栈空间。默认堆栈大小为1MB。如果将堆栈推到该大小之上,则表示堆栈溢出并引发错误 CLR采用与本机代码不同的策略,本机代码仅保留1MB,但根据需要提交 这些是实施细节。最好只是将堆栈看作
PS:这一切都是从讨论如何构建一个计算斐波那契序列的方法开始的,其中一个建议是递归函数。CLR会在每个线程创建后立即提交完整的堆栈空间。默认堆栈大小为1MB。如果将堆栈推到该大小之上,则表示堆栈溢出并引发错误 CLR采用与本机代码不同的策略,本机代码仅保留1MB,但根据需要提交 这些是实施细节。最好只是将堆栈看作一个固定大小的数据结构。此视图适用于.net和本机堆栈实现 递归函数是计算斐波那契函数最糟糕的方法,因为它的复杂性是指数级的。相反,你应该使用一个迭代算法,它在时间上是线性的,在空间上是恒定的。例如:
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;
}
静态整数fib(整数n)
{
int结果=0;
INTA=1;
对于(int i=1;i@Marc幼稚的递归算法,即fib(n)=fib(n-1)+fib(n-2)
具有指数复杂性,请看-我同意我上面的陈述是草率的,我将纠正这一点,是的,因此我的“前两个术语”-我想即使在一个缓慢的日子里,我也不会想到斐波那契的实现会那么糟糕;p@Marc如果你能记忆化,这是一个非常好的实现。例如,我认为Python有一个内置的记忆化修饰符,可以将这个可怕的fib
版本变成一个超级高效的版本。单个修饰符可以将O(1^n)变成O(n)好工作比1^n便宜,那么;p(开玩笑,我知道你的意思)@Marc是的,我不太擅长这个O()东西!我想我应该写O(k^n)。