运行时堆栈大小会增长吗?

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

抱歉,Rachel,我不认为这确实与数据结构有关。编辑已经恢复。 - Chris Lutz
6个回答

9

当你在分配本地变量和调用函数时,堆栈使用量肯定会增加。虽然堆栈的最大大小在技术上是未定义的,但在实践中通常是恒定的。您可以通过向操作系统添加标志来使这个常量更大,但通常每个线程都会获得一定大小的堆栈。当您使用太多的时候,就会发生堆栈溢出。


有没有命令可以查看由操作系统确定的堆栈大小? - user188276
你想解决什么问题?在提问时,请告诉我们你的目标,而不是你的计划。 - GManNickG
3
在Windows中,堆栈大小是映像文件PE头的一部分。要检查映像中的堆栈大小,请使用dumpbin /headers命令。 - Brian Rasmussen

3
实际分配的堆栈大小在现代桌面操作系统上可以增长。
实际上,它是基于内存管理单元实现的。当内存访问超出当前已提交的堆栈页面时,新的内存页面将被提交。只有实际使用的页面(通常加上一个警戒页面)会在RAM中使用。最大堆栈空间可以通过系统资源限制来控制。例如,在POSIX.1-2001上,您可以使用getrlimit()查询进程的最大堆栈大小。
另一方面,旧操作系统和许多嵌入式系统,缺乏基于硬件的内存管理单元,确实对堆栈大小设置了固定限制。

这是否意味着如果程序使用更多的堆栈内存,分配的堆栈大小可以在运行时增长?那么为什么会发生“堆栈溢出”?虽然我们可以在运行程序之前设置更大的堆栈大小。 - starriet
发生堆栈溢出并不需要输入比整个堆栈大小更多的数据。如果您有一个需要一字节内存空间的字符类型变量,并且用户以某种方式输入了两个字节的数据,则会导致缓冲区溢出。 - Newbie
@新手 这个网站真的叫做“堆栈溢出”吗?无论如何,整个堆栈都溢出的情况是可能发生的,对吧?另外,这个被接受的答案怎么样?它说堆栈大小通常是固定的,在Linux或Windows系统上是正确的。(虽然用户可以修改该常量,就像我上面提到的那样。) - starriet
@starriet,感谢你提出“flag”。我忘记了我在谈论堆栈溢出而不是缓冲区溢出。所以,我混淆了堆栈溢出和缓冲区溢出。抱歉,我无法编辑我的先前评论。 我不确定_laalto_的说法,“实际分配的堆栈大小可以在...”是否在运行时期间增加。如果MMU自动增加堆栈大小,那么就像你提到的那样,除非可用空间受其他因素(如RAM大小)的限制,否则不应发生堆栈溢出。 - Newbie

1

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


0

0
从我所记得的来看,栈通常基于存在于连续内存范围内的假设。基本上,它们期望下一个栈帧在内存的下一位(这有助于加快运行速度,避免指令查找)。正如其他人所说,这是可能的,但我认为它并不广泛使用。

-2

是的,我认为答案是正确的。


但它回答了问题,但并没有提供太多信息。 - PostMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接