回答
這是所有的Win32特定的(不是真的C-具體的,一切都只是OS API):
當創建一個線程,它得到1MB堆棧空間默認情況下,可以不管的CreateThread API中進行修改你用。
您可以查看線程信息塊以查找實際的堆棧信息,但即使已記錄此信息,此技術並未得到正式支持,請參閱http://en.wikipedia.org/wiki/Win32_Thread_Information_Block。
此外,對於32位應用程序,您最多隻能處理2GB,因此對於設計使用大量內存的應用程序,需要注意的是該進程的虛擬地址的總大小空間(承諾+保留),其中包括所有堆分配。您可以通過GlobalMemoryStatusEx API以編程方式訪問進程的虛擬內存,查看虛擬地址空間的參數ullTotalVirtual。一旦您的流程接近1.8或1.9GB的VAS,堆分配和VirtualAlloc調用開始失敗。對於「正常」應用程序,您不必擔心VAS用完,但檢查失敗分配總是有好處的。另外,除非有錯誤或設計不好,否則不應該發生堆棧溢出。
這非常有幫助,謝謝。這給了我一個起點。 – dvanaria 2010-09-27 04:22:15
有一種理念,當你需要提出這些問題時,出於實際而不是教育或信息的原因,那麼你正在做出嚴重錯誤的事情。
如果你是要求這個錯誤檢查或確保你的程序有足夠的內存,等等...那麼不要擔心,認真。至於你的程序內存,如果這只是爲了調試,你可以使用任務管理器(在Windows上)。如果你需要在你的程序中知道這一點,我不會指望任何非hacky的解決方案。
哈,謝謝你的回答。這完全是出於教育原因。我編寫了如此多的C程序,並對內存空間的成本/使用情況有一個模糊的概念,但是想知道專業開發人員如何獲得關於他們的程序如何影響系統的具體想法。 – dvanaria 2010-09-25 12:04:36
另一種哲學是,如果你的程序需要內存,它應該簡單地嘗試分配它並準備處理失敗。明智地分配你的東西總是很好的做法。除非你有一個要求你不能分配超過_x_的內存量,否則它對系統其餘部分的影響確實是一個系統工程問題。另外,不要以爲這個數字是固定的。您的程序可以運行在一個操作系統上,該系統旨在終止優先級較低的進程,以便在優先級較高的進程碰到最高限度時釋放內存。 – Blrfl 2010-09-25 12:49:48
抽象的原因 真的,你的程序不應該有這個擔心。這是一個操作系統的問題,你的問題應該只是滿足它的需求並讓操作系統完成它的工作。
如果你堅持,你可以看看/proc/meminfo
,brk()
,getrlimit()
和setrlimit()
(here are some docs)與近似和粗糙ishes的RLIMIT_STACK
和RLIMIT_DATA
值。
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main (int argc, char *argv[])
{
struct rlimit limit;
/* Get the stack limit. */
if (getrlimit(RLIMIT_STACK, &limit) != 0) {
printf("getrlimit() failed with errno=%d\n", errno);
exit(1);
}
printf("The stack soft limit is %llu\n", limit.rlim_cur);
printf("The stack hard limit is %llu\n", limit.rlim_max);
exit(0);
}
從here修改也看到man getrlimit
系統
。如果你的狀態什麼和爲什麼你想這樣做,可能是有人做你想要什麼更好的方法或途徑。
- 1. 計算器堆棧
- 2. Java計算器堆棧
- 3. 進程虛擬內存 - 堆棧和堆之間的空間
- 4. 堆棧空間異常
- 5. 用盡ValueType堆棧空間
- 6. JVM - 堆棧和堆棧
- 7. 多線程程序在C:計算線程堆棧空間
- 8. 當計算素數時堆棧空間溢出
- 9. 未初始化的堆和堆棧空間值
- 10. Monad變換器:用MaybeT(狀態堆棧)實現堆棧機
- 11. 堆棧實現
- 12. 堆棧溢出:在堆棧空間中複製臨時分配?
- 13. 數組如何在Java中使用堆棧和堆空間?
- 14. 替代堆棧
- 15. 使用2堆棧的計算器
- 16. 用堆棧和迭代器編寫後綴計算器
- 17. EmptyStackException非空堆棧
- 18. 塊+ ARC,堆棧和堆
- 19. 線程堆和堆棧
- 20. 堆棧和堆查看器
- 21. 堆棧幀和堆棧指針
- 22. 的堆棧空間 - 在公式中
- 23. 堆棧機器代碼的SSA
- 24. C++堆棧實現
- 25. 堆棧或堆
- 26. 堆棧實現期間的java.lang.ArrayIndexOutOfBoundsException
- 27. DFS和堆棧
- 28. 如何計算給定程序的堆棧和堆佔用的內存?
- 29. 希望堆棧堆棧?
- 30. 空堆棧的鏈表
這裏是關於Windows系統中堆棧大小的一些信息http://msdn.microsoft.com/en-us/library/ms686774%28VS.85%29.aspx – 2010-09-25 13:32:41