如何分配递归中的内存分配

时间:2013-11-16 13:18:34

标签: c recursion compilation

int fact(int x)
{
    if (x == 1)
        return 1;
    else 
        return (x * fact(x-1));
}

我的问题是在函数调用期间如何在堆栈上分配变量以及x = 5 - 显然返回值为5 * fact(4),但是如何将5 * fact(4)推送到堆栈上它的值将在以后解析,即可以推送简单值(非变量)并可以检索它们的值,但编译器如何处理fact(4)。 任何人都可以解释这个递归过程究竟是由编译器实现的吗?

1 个答案:

答案 0 :(得分:3)

在返回5 * fact(4)之前,在新的堆栈帧上调用并计算fact(4) fact(4)。当对fact(5)的调用完成时,它将返回值放在fact(1)堆栈帧可以到达的位置(这可能是堆栈或寄存器中),并使用它来计算自己的返回值。因此,完成评估的顺序为fact(2)fact(4),...,fact(5),{{1}}。每个都将它们的返回值放在下一个可以检索它的位置,并用它来计算它自己的返回值。