什么限制了我在内存方面对堆栈的使用?

时间:2009-11-02 11:12:17

标签: c++ c windows winapi

在Windows(或任何其他操作系统)中,是什么决定了我可以使用多少堆栈?这个网站的名称让我觉得它可以用完堆栈,所以我应该避免在堆栈上放入大量数据吗?

6 个答案:

答案 0 :(得分:3)

在Win32上,默认堆栈大小为1MB,可以在调用CreateThread()和编译器设置时调整。

答案 1 :(得分:2)

它是特定于语言的,编译器特定的,可能是特定于操作系统的,但是您应该将大量数据放在堆上而不是堆栈上。

Other SO post about this

有很多方法可以改变堆栈大小 - 但我不会乱用它!

如果你想通过试验和错误知道你的堆栈大小 - 只需在堆栈上创建一个数组,看看它能让你多少......

答案 2 :(得分:1)

它完全特定于OS并且可配置,在linux上你可以通过shell中的ulimit调用来检查和更改。

取决于你所谓的大,我目前的Debian标准堆栈大小是8兆,这足够大,例如1Meg的大数组。

答案 3 :(得分:1)

您可以在

下的Visual Studio中设置应用程序的堆栈大小
Project->Properties->Linker->System

虽然不推荐使用编程技术,但检索可用堆栈空间的量相当简单:

CONTEXT                       Context;
memset(&Context, 0, sizeof(Context));
RtlCaptureContext(&Context);

long stackFree = Context.Rsp;

答案 4 :(得分:1)

在Windows上,对于Visual Studio中的本机C / C ++项目,使用链接器的/STACK选项(IDE项目中的“链接器/系统/堆栈保留大小”)设置初始/主线程的stacksize属性),默认为1MB。这也是未指定更具体内容的新线程的默认线程堆栈大小。

对于随后生成的线程,_beginthread()_beginthreadex()CreateThread()都有一个参数,可以让您指定线程的堆栈大小,默认为您在链接器中设置的内容如果传入零,则属性。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms686774.aspx

答案 5 :(得分:0)

操作系统将设置一个上限,但您可以使用链接器设置一个特定限制,它通常具有特定的默认值,通常远低于操作系统允许的范围。