簡體   English   中英

什么限制了我在內存方面對堆棧的使用?

[英]What limits my use of the stack in terms of memory?

在Windows(或任何其他操作系統)中,什么決定了我可以使用多少堆棧? 這個網站的名稱讓我覺得它可以用完堆棧,所以我應該避免在堆棧上放入大量數據嗎?

在Win32上,默認堆棧大小為1MB,可以在調用CreateThread()和編譯器設置時進行調整。

它是特定於語言的,特定於編譯器的,可能是特定於操作系統的,但是您應該將大量數據放在堆上而不是堆棧上。

關於此的其他SO帖子

有辦法改變堆棧大小 - 但我不會惹它!

如果你想通過試驗和錯誤知道你的堆棧大小 - 只需在堆棧上創建一個數組,看看它能讓你多少...

它完全是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM