如何跟踪递归函数的调用堆栈使用情况

时间:2016-03-05 02:05:58

标签: c++ recursion

我正在教一门课程来介绍C ++学生,我想设计一个实验,展示递归函数与迭代的不同之处。我的想法是跟踪两者的内存/调用堆栈使用情况并显示差异。当我完成学位课程时,我几乎肯定我做了类似的事,但不记得了。我的经验并不在于C / C ++,所以任何指导都会受到赞赏。

更新1:

我相信我可能会错过代表我的任务。我曾希望找到一种方法来展示递归与迭代相比如何增加开销/堆栈。我按照一些建议的链接,提出了以下脚本。

loops=100
counter=0
total1=0
echo "Iteration"
while [ $counter -lt $loops ]; do
    "$1" & # Run the given command line in the background.
    pid=$! peak1=0
    echo -e "$counter.\c"
    while true; do
    #sleep 0.1
        sample="$(pmap $pid | tail -n1 | sed 's/[^0-9]*//g' 2> /dev/null)" || break

        if [ -z "$sample" ]; then
            break
        fi
        let peak1='sample > peak1 ? sample : peak1'
    done
#    echo "Peak: $peak1" 1>&2
    total1=$(expr $total1 + $peak1)
    counter=$[$counter+1]
done

该程序使用迭代或递归实现二进制搜索。我们的想法是获得平均内存使用量并将其与同一程序的Recursion版本进行比较。这不起作用,因为迭代版本通常具有比递归更大的内存平均值,这不会向我的学生显示递归具有缺点。因此,我很确定我做错了。

pmap不会向我提供我想要的东西吗?

2 个答案:

答案 0 :(得分:3)

我认为这样的事情

void recursive(int* ptop) {
  int dummy = 0; 
  printf("stack size %d\n",&dummy - ptop);
  recursive(ptop);
}

void start() {
  int dummy = 0;      
  recursive(&dummy);
}

直到它崩溃。

答案 1 :(得分:0)

在任何知道它们的平台上(Linux),回溯(3),甚至更好的 backtrace_symbols(3),他们的同伴应该会有很大的帮助。

相关问题