回答
在UNIX環境下,如果你正在運行bash運行
$ ulimit -a
它會列出各種限制,包括堆棧大小。我的是8192kb。您可以使用ulimit來更改限制。
此外,您可以使用ulimit()函數在程序中設置各種限制。
$ man 3 ulimit
在Windows看到StackReserveSize和StackCommitSize
在實踐堆棧地址在高地址(32位的平臺上,靠近3GB極限)和減小開始而存儲器分配開始於低地址。這允許堆棧和內存增長,直到整個內存耗盡。
在我的32位linux上,它的8192K字節。所以它應該在你的機器上是相同的。
$ uname -a
Linux TomsterInc 2.6.28-14-generiC#46-Ubuntu SMP Wed Jul 8 07:21:34 UTC 2009 i686 GNU/Linux
$ ulimit -s
8192
的Windows(我認爲Linux的),無論在大棧模型假設工作,也就是說,有一個堆棧(每個線程),其空間線程開始之前進行了預分配。 我懷疑操作系統只是將預先分配的大小的虛擬內存空間分配給該堆棧區域,並且隨着堆棧的末端超出頁邊界而添加下面的實際內存頁面,直到達到上限(「ulimit」).ck由於操作系統經常將堆棧遠離其他結構,因此當達到ulimit時,操作系統可能能夠擴展堆棧,如果發生溢出時沒有其他東西顯示在堆棧旁邊,就可能會擴展堆棧。一般來說,如果你正在構建一個足夠大的程序複合體來溢出堆棧,你可能會動態地分配內存,並且沒有人認爲堆棧旁邊的區域沒有被分配。如果分配了這樣的內存,操作系統當然不能擴展堆棧。
這意味着應用程序無法指望操作系統自動擴展的堆棧。實際上,堆棧不能增長。
理論上,一個耗盡堆棧的應用程序可能會啓動一個更大堆棧的新線程,複製現有的堆棧並繼續,但實際上我懷疑這是可以做到的,如果除了指針之外沒有別的原因到局部變量堆棧將需要調整和C/C++編譯器不能找到這樣的指針並調整它們。 結果:ulimit必須在程序啓動之前聲明,並且一旦超過,程序就會死亡。
如果您想要一個可以任意擴展的堆棧,最好切換到使用堆分配激活記錄的語言。然後,只需在地址空間用完之前不要耗盡。 32或64位虛擬機空間確保您可以使用此技術進行大量遞歸。
我們有一種名爲PARLANSE的並行編程語言,它可以堆分配,以使成千上萬的並行計算粒度(實際上)能夠以這種方式任意遞歸。
- 1. 64位系統上的32位應用程序的內存分配限制
- 2. 如何從x64模式的windows下的現有32位進程獲得32位堆棧限制/ 32位TEB/TIB?
- 3. 在64位機器上限制芯片32位
- 4. 堆棧或堆上的對象分配
- 5. 堆/堆棧上的類成員分配?
- 6. 堆棧上字符串的分配
- 7. 在所有計算機上,程序的調用堆棧限制是否一致?
- 8. DevC++(Mingw)堆棧限制
- 9. 分離強制的32位程序集
- 10. Linux中進程的堆棧大小是否有限制
- 11. Linux堆分配
- 12. 32位/ 64位Windows/Linux應用程序
- 13. C++堆棧與堆分配
- 14. 在64位機器上編譯32位matlab應用程序(C++)
- 15. 堆棧或堆棧分配不正確
- 16. C堆棧分配
- 17. 在64位linux armv8機器上編譯32位二進制時遇到問題
- 18. 堆棧溢出:在堆棧空間中複製臨時分配?
- 19. C中的堆棧分配
- 20. .NET堆棧內存限制
- 21. Linux下的僞隨機堆棧指針?
- 22. linux內核如何強制實現堆棧大小限制?
- 23. 堆棧上分配多少空間
- 24. 在32位機器上執行c程序
- 25. 需要在64位Redhat機器上配置/編譯/編譯32位的libxml2
- 26. linux上的QtCreator:32位與64位
- 27. 爲什麼在32位機器上有2GB redis.io數據庫的限制
- 28. 我的程序,以簡化分數被打調用堆棧限制。爲什麼?
- 29. C++循環堆棧分配
- 30. 動態分配stdlib堆棧?
您是否正在討論堆棧在* runtime *時可以增長多少,或者編譯時編譯器爲一個*單個幀分配了多少空間?在運行時,編譯器不會成爲放棄的部分。 – 2009-11-22 18:43:35
是的,在運行時可以爲程序堆棧增長多少,是否有限制 – kal 2009-11-22 18:45:40