4

我想知道堆栈大小是否会像堆一样在运行时增长?

4

6 回答 6

7

当您分配局部变量并进行函数调用时,使用的堆栈数量肯定会增加。堆栈的最大大小是否可以增长在技术上是不确定的,但实际上通常是恒定的。您可以使用操作系统的标志使常量更大,但通常每个线程都会获得一定大小的堆栈。当你使用太多时,它是一个堆栈溢出。

于 2009-11-03T05:25:07.610 回答
3

实际分配的堆栈大小可以在现代桌面操作系统上增长。

在实践中,它是根据内存管理单元来实现的。当内存被访问超出堆栈的当前提交页面时,新的内存页面被提交。只有实际使用的页面(通常加上一个保护页面)在 RAM 中使用。最大堆栈空间可以通过系统资源限制来控制。例如,在 POSIX.1-2001 上,您可以使用getrlimit().

另一方面,缺乏基于硬件的内存管理单元的旧操作系统和许多嵌入式系统确实对堆栈大小设置了固定限制。

于 2009-11-03T08:09:37.980 回答
1

我认为可执行堆栈大小是由编译器/链接器定义的。所以你可以改变它,但不能在运行时改变。您可以更改线程的堆栈大小。+ 一切都是编译器和操作系统特定的,所以这里没有单一的答案。

于 2009-11-03T05:28:42.750 回答
0

据我所知,堆栈通常在它们存在于连续内存范围内的假设下运行。基本上,期望下一个堆栈帧位于内存的下一位(这有助于它运行得更快,而不必进行指令查找)。就像其他人所说的那样,这是可能的,但我认为它没有被广泛使用。

于 2009-11-03T06:24:16.463 回答
0

线程的堆栈空间由编译器设置。我的编译器将保留 2Mb 的空间。并将提交 1 Mb。

当然,您可以更改编译器的默认堆栈大小,或者您可以通过调用 CreateThread 来启动具有更大堆栈大小的新线程。 http://msdn.microsoft.com/en-us/library/ms682453%28VS.85%29.aspx

于 2009-12-03T05:23:10.110 回答
-2

是的。我认为答案是真的

于 2010-02-04T19:41:01.690 回答