堆栈大小是否在运行时增长?

时间:2009-11-03 05:23:21

标签: c stack heap

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

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-2)

是肯定的。我认为答案是真的