Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中的CLR上下文中,堆栈空间是如何分配的_C#_Vb.net_Memory Management_Stack_Stack Overflow - Fatal编程技术网

C# 在.NET中的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,但根据需要提交 这些是实施细节。最好只是将堆栈看作

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

例如:

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


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)。