2012-02-28 10 views
0

在使用帶有2GB RAM的Visual C++的Windows XP上,需要在堆棧上同時創建一個stackoverflow的函數有多少? (即在遞歸函數中)創建一個stackoverflow有多少個函數?

是否有一種簡單的方法可以計算出其他類似情況?

+0

該堆棧默認爲兆字節。經過優化的版本中可能的最小堆棧幀爲4個字節。實際的更大。 RAM與它無關。 – 2012-02-28 02:26:47

+1

我只能在一個函數調用中溢出堆棧。 – mah 2012-02-28 03:03:17

回答

3

僅憑編譯器無法知道。堆棧溢出是由於溢出堆棧而發生的。堆棧的大小取決於函數使用的參數,函數使用的局部變量以及編譯器優化。我相信甚至有一些C99函數會直接從堆棧中分配空間。

堆棧大小的限制是由編譯器開關決定的,而不是您計算機中有多少RAM。因此,溢出需要多少次調用與編譯器設置有關,而不是內存。

這不是你可以確定的先驗。至少,並不平凡。

+1

實際上,通過查看PE可選標題(偏移72)中的SizeOfStackCommit字段,可以確定運行時的圖像堆棧限制。正如漢斯所說,它通常是0x10000(1MB)。 – 2012-02-28 05:08:25

0

您可以嘗試一個無限遞歸..這是堆棧溢出的常見原因之一。

int f() { g(); } int g() { f(); }

+0

這並不回答這個問題。 - 另外,我預料它會在不到5秒的時間內產生堆棧溢出,但它會超時:http://ideone.com/QoWtS;) – visitor 2012-02-28 09:07:41

相關問題