是啥限制了我在内存方面对堆栈的使用?
Posted
技术标签:
【中文标题】是啥限制了我在内存方面对堆栈的使用?【英文标题】:What limits my use of the stack in terms of memory?是什么限制了我在内存方面对堆栈的使用? 【发布时间】:2010-12-12 06:02:13 【问题描述】:在 Windows(或任何其他操作系统)中,是什么决定了我可以使用多少堆栈?这个网站的名称让我认为它可能会用完堆栈,所以我应该避免将大量数据放在堆栈上吗?
【问题讨论】:
【参考方案1】:在 Win32 上默认堆栈大小为 1MB,可以在调用 CreateThread() 时和编译器设置中进行调整。
【讨论】:
【参考方案2】:它是特定于语言、编译器和可能特定于操作系统的,但您应该将大量数据放在堆上而不是堆栈上。
Other SO post about this
有一些方法可以改变堆栈大小 - 但我不会搞砸它!
如果您想通过反复试验来了解您的堆栈大小 - 只需在堆栈上创建一个数组,看看它可以让您多少...
【讨论】:
【参考方案3】:它完全是特定于操作系统且可配置的,在 linux 上,您可以通过 shell 中的 ulimit 调用来检查和更改。
取决于你所说的大,我目前的 Debians 标准堆栈大小是 8 megs,这足以容纳例如 1Meg 的大型数组。
【讨论】:
【参考方案4】:您可以在 Visual Studio 中为您的应用程序设置堆栈大小
Project->Properties->Linker->System
虽然不推荐一种编程技术,但检索可用堆栈空间量相当简单:
CONTEXT Context;
memset(&Context, 0, sizeof(Context));
RtlCaptureContext(&Context);
long stackFree = Context.Rsp;
【讨论】:
【参考方案5】:在 Windows 上,对于 Visual Studio 中的本机 C/C++ 项目,初始/主线程的堆栈大小使用链接器的 /STACK
选项(IDE 项目属性中的“链接器/系统/堆栈保留大小”)设置, 默认为 1MB。这也是未指定更具体内容的新线程的默认线程堆栈大小。
对于随后生成的线程,_beginthread()
、_beginthreadex()
和 CreateThread()
都有一个参数可以让您指定线程的堆栈大小,如果您传入零,它将默认为您在链接器属性中设置的值.
详情请见http://msdn.microsoft.com/en-us/library/ms686774.aspx。
【讨论】:
【参考方案6】:操作系统会设置一个上限,但您可以使用 链接器 设置一个特定的限制,它通常有一个特定的默认值,通常远低于操作系统允许的值。
【讨论】:
以上是关于是啥限制了我在内存方面对堆栈的使用?的主要内容,如果未能解决你的问题,请参考以下文章