![](/img/trans.png)
[英]What is the difference between user defined stack and built in stack in use of memory?
[英]What limits my use of the stack in terms of memory?
在Windows(或任何其他操作系統)中,什么決定了我可以使用多少堆棧? 這個網站的名稱讓我覺得它可以用完堆棧,所以我應該避免在堆棧上放入大量數據嗎?
在Win32上,默認堆棧大小為1MB,可以在調用CreateThread()和編譯器設置時進行調整。
它是特定於語言的,特定於編譯器的,可能是特定於操作系統的,但是您應該將大量數據放在堆上而不是堆棧上。
有辦法改變堆棧大小 - 但我不會惹它!
如果你想通過試驗和錯誤知道你的堆棧大小 - 只需在堆棧上創建一個數組,看看它能讓你多少...
它完全是OS特定的和可配置的,在linux上你可以檢查和更改shell中的ulimit調用。
取決於你所謂的大,我目前的Debian標准堆棧大小是8兆,這足夠大,例如1Meg的大陣列。
您可以在Visual Studio下為應用程序設置堆棧大小
Project->Properties->Linker->System
雖然不推薦使用aa編程技術,但檢索可用堆棧空間量相當簡單:
CONTEXT Context;
memset(&Context, 0, sizeof(Context));
RtlCaptureContext(&Context);
long stackFree = Context.Rsp;
在Windows上,對於Visual Studio中的本機C / C ++項目,初始/主線程的stacksize是使用鏈接器的/STACK
選項(IDE的項目屬性中的“鏈接器/系統/堆棧保留大小”)設置的,默認為1MB。 這也是未指定更具體內容的新線程的默認線程堆棧大小。
對於隨后生成的線程, _beginthread()
, _beginthreadex()
和CreateThread()
都有一個參數,可以讓您指定線程的堆棧大小,如果傳入零,則默認為您在鏈接器屬性中設置的大小。
有關詳細信息,請參閱http://msdn.microsoft.com/en-us/library/ms686774.aspx 。
操作系統將設置上限,但您可以使用鏈接器設置特定限制,通常具有特定默認值,通常遠低於操作系統允許的限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.