2016-03-05 46 views
0

我正在教一个类来介绍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 

该程序实现二进制搜索与迭代或递归。这个想法是获得平均内存使用并将其与同一程序的递归版本进行比较。这不起作用,因为迭代版本的平均记忆比递归更大,而这并不会给我的学生显示递归有缺点。所以我很确定我做了一些不正确的事情。

pmap是不是会给我提供我想要的东西?

+0

使用[gdb](https://www.gnu.org/software/gdb/)的['backtrace'](https://sourceware.org/gdb/onlinedocs/gdb/Backtrace.html)? –

+0

简版ps或'sysinfo.h'。检查http://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process和http://stackoverflow.com/questions/131303/how-to -measure-实际内存使用-的-AN-应用或进程。 – knightrider

回答

3

像这样的事情,我认为

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

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

,直到它会崩溃。

0

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