對於使用遞歸函數的C++程序,如何評估此函數佔用的動態堆棧大小?由遞歸函數佔用的堆棧大小維
回答
void recursive_function()
{
int dummy;
cout << "stack = " << &dummy << '\n';
...
}
關注&dummy
上升爲堆棧使用值上升(或下降,如果你的籌碼向下增長)。
或者如果使用非線性堆棧,則跳過內存。 – 2013-03-23 21:50:56
好吧,至少OP會知道他們有什麼樣的堆棧。 – john 2013-03-23 21:51:32
很好的答案,但我認爲'&dummy'隨着堆棧大小的增加而下降... – 2013-03-23 21:53:01
#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之間,具體取決於您的函數包含的內容)。
- 1. 遞歸堆棧大小?
- 2. 遞歸堆棧大小
- 3. 在遞歸函數中調用堆棧大小:最大調用堆棧大小低於預期
- 4. 遞歸 - 調用堆棧失敗測試的最大堆棧大小
- 5. 遞歸函數中的堆棧溢出
- 6. 堆棧上的遞歸函數
- 7. 在SetTimeout遞歸函數(Javascript)上超出最大調用堆棧大小
- 8. javascript遞歸函數:未捕獲RangeError:超過最大調用堆棧大小
- 9. 由遞歸函數引起的堆棧溢出
- 10. Lisp堆棧溢出遞歸函數
- 11. 遞歸函數堆棧溢出
- 12. 遞歸函數堆棧溢出
- 13. 在遞歸函數中存儲堆棧
- 14. 遞歸函數haskell堆棧溢出
- 15. 超出最大調用堆棧大小。遞歸標籤
- 16. JavaScript遞歸:超出最大調用堆棧大小
- 17. OpenCL函數調用堆棧大小
- 18. 遞歸Java - 堆棧
- 19. C++遞歸堆棧
- 20. 遞歸:使用堆棧
- 21. 遞歸JavaScript超過調用堆棧大小
- 22. 遞歸函數或塊的堆棧和堆條件?
- 23. 將遞歸函數中的setTimeOut函數導致堆棧溢出?
- 24. 增加Python中的遞歸限制和堆棧大小2.7
- 25. 由於遞歸構造函數調用導致的java堆棧溢出
- 26. 在堆上分配vs在遞歸函數中分配堆棧
- 27. Lisp中遞歸函數調用的堆棧溢出
- 28. 我在使用的std ::堆棧以遞歸函數檢索值
- 29. 遞歸迭代器上的最大調用堆棧大小錯誤
- 30. 超過最大調用堆棧大小 - 沒有明顯的遞歸
此功能重複多少次? – 2013-03-23 21:48:41
@delnan如果確切字節數:那麼就是42. – 2013-03-23 21:49:01
完全依賴於硬件/操作系統/編譯器/優化級別。因此幾乎無法回答。毫無意義。你爲什麼在乎。如果甚至有可能吹你的堆棧,那麼你應該使用迭代解決方案。 – 2013-03-23 21:50:14