递归函数中的变量是否在每个调用中占用相同的内存地址?

时间:2017-09-29 11:52:02

标签: c++ recursion

void recur(int arr[], int l, int m, int r)
 {
   int L[4], R[4];
   // some statements

   recur(/*those arguments*/); //say.
 }

现在,如果我以递归方式调用recur()函数,L[4]R[4]将为每次递归调用获取相同的内存地址,否则每次调用将占用不同的内存地址。

2 个答案:

答案 0 :(得分:2)

答案是否定的。每次调用函数(任何函数)都会创建一个新的堆栈帧,其中包含用于局部变量的新内存,无论谁调用该函数(相同的函数或另一个函数)。这意味着不同的内存地址。

大多数时候这个答案都是正确的。然而,正如巧妙评论的那样,当函数做的最后一件事就是调用自身时,大多数编译器都会执行尾调用优化并消除对所有堆栈的需要,对所有调用使用相同的堆栈,使用不同的参数。

在此处阅读更多内容:Stack Frame

答案 1 :(得分:1)

考虑到它不是Tail CallTail Call Optimisation,那么简短的回答是。但是,如果是TCO则。感谢@lorro指出它!

void recur(int arr[], int l, int m, int r)
 {
   int L[4], R[4];
   // some statements

   recur(/*those arguments*/); //say.
 }

递归中的变量不要采用相同的内存地址。 每个函数调用都为函数创建一个新的“激活记录”,它包含它自己的堆栈,其中存储了堆栈动态变量。

在此处阅读更多内容:Activation Records