2016-03-05 85 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)和他們的同伴應該是有很大的幫助。