2013-03-23 70 views
6

對於使用遞歸函數的C++程序,如何評估此函數佔用的動態堆棧大小?由遞歸函數佔用的堆棧大小維

+0

此功能重複多少次? – 2013-03-23 21:48:41

+0

@delnan如果確切字節數:那麼就是42. – 2013-03-23 21:49:01

+0

完全依賴於硬件/操作系統/編譯器/優化級別。因此幾乎無法回答。毫無意義。你爲什麼在乎。如果甚至有可能吹你的堆棧,那麼你應該使用迭代解決方案。 – 2013-03-23 21:50:14

回答

7
void recursive_function() 
{ 
    int dummy; 
    cout << "stack = " << &dummy << '\n'; 
    ... 
} 

關注&dummy上升爲堆棧使用值上升(或下降,如果你的籌碼向下增長)。

+1

或者如果使用非線性堆棧,則跳過內存。 – 2013-03-23 21:50:56

+0

好吧,至少OP會知道他們有什麼樣的堆棧。 – john 2013-03-23 21:51:32

+0

很好的答案,但我認爲'&dummy'隨着堆棧大小的增加而下降... – 2013-03-23 21:53:01

2
#include <stdio.h> 
#include <stdlib.h> 

ssize_t recurse(int limit, char* stack = NULL) 
{ 
    char dummy; 

    if (stack == NULL) 
     stack = &dummy; 

    if (limit > 0) 
     return recurse(limit - 1, stack); 
    else 
     return stack - &dummy; 
} 

int main(int argc, char* argv[]) 
{ 
    int limit = atoi(argv[1]); 
    printf("depth %d took %zd bytes\n", limit, recurse(limit)); 
    return EXIT_SUCCESS; 
} 

如果我跑這跟我4得到:

depth 4 took 192 bytes 

正如其他人在評論中建議,這不是完全可移植的,但它應該在一個相當廣泛的各種現有系統的正常工作。請注意,結果類型是在發生「怪異」事件時簽署的 - 您可以確定它是否具有完整性(例如,確保它在5到500之間,具體取決於您的函數包含的內容)。