在使用帶有2GB RAM的Visual C++的Windows XP上,需要在堆棧上同時創建一個stackoverflow的函數有多少? (即在遞歸函數中)創建一個stackoverflow有多少個函數?
是否有一種簡單的方法可以計算出其他類似情況?
在使用帶有2GB RAM的Visual C++的Windows XP上,需要在堆棧上同時創建一個stackoverflow的函數有多少? (即在遞歸函數中)創建一個stackoverflow有多少個函數?
是否有一種簡單的方法可以計算出其他類似情況?
僅憑編譯器無法知道。堆棧溢出是由於溢出堆棧而發生的。堆棧的大小取決於函數使用的參數,函數使用的局部變量以及編譯器優化。我相信甚至有一些C99函數會直接從堆棧中分配空間。
堆棧大小的限制是由編譯器開關決定的,而不是您計算機中有多少RAM。因此,溢出需要多少次調用與編譯器設置有關,而不是內存。
這不是你可以確定的先驗。至少,並不平凡。
實際上,通過查看PE可選標題(偏移72)中的SizeOfStackCommit字段,可以確定運行時的圖像堆棧限制。正如漢斯所說,它通常是0x10000(1MB)。 – 2012-02-28 05:08:25
您可以嘗試一個無限遞歸..這是堆棧溢出的常見原因之一。
int f() { g(); } int g() { f(); }
這並不回答這個問題。 - 另外,我預料它會在不到5秒的時間內產生堆棧溢出,但它會超時:http://ideone.com/QoWtS;) – visitor 2012-02-28 09:07:41
該堆棧默認爲兆字節。經過優化的版本中可能的最小堆棧幀爲4個字節。實際的更大。 RAM與它無關。 – 2012-02-28 02:26:47
我只能在一個函數調用中溢出堆棧。 – mah 2012-02-28 03:03:17