Perl中深度调用堆栈的潜在影响是什么?

Aar*_*ron 1 perl

  • 我被告知以下部分代码是深度递归的.但是我不明白 - 有人可以解释一下吗?
  • 如果是,那么相关的含义是什么?

注意:

琐碎的例子

            check:
            # Grab some data held in a file
            while ((ReadFile ()) != 0 ) { 
                    if ((checkSomething ()) != 1) {
                            # value found, check file again
                            next check;
                    } else {
                            blah ($doo, $foo);
                    }
            }
Run Code Online (Sandbox Code Playgroud)

更新:

  • 谢谢你的纠正.
  • 在内存消耗方面,以下内容有何影响 - 据我所知,在审核其他问题后,这不是递归:

    sub D {
            ..
    }
    sub C {
            D ();
    }
    sub B {
            C ();
    }
    sub A {
            while (true) {
                    B ();
            }
    }
    
    Run Code Online (Sandbox Code Playgroud)

Dan*_*Dan 8

你的第二个例子也不是递归的例子.这只是我非正式地称之为"链式子程序调用"的一个例子 - 我不相信它有一个正式的术语.递归要求子程序直接或通过一组中介调用自身.

例如,如果子程序D在某些条件下对A,B或C进行了调用,那将是递归.

至于深度调用堆栈,答案取决于:

  • 有多深
  • 你在每个人中传递了多少个论点
  • 你的程序可以分配多少内存

每次调用子例程时,它都会在调用堆栈上添加一个新帧.该子帧一直保持到子程序完成为止.此堆栈帧的大小主要取决于参数列表的长度,加上一些固定的开销.

所以在这种情况下,你有一个包含四个元素的堆栈框架.

如果你的调用链变得太深并且每个条目都有很长的参数列表,那么你最终会用尽调用堆栈的空间.这称为堆栈溢出.:)