gpt4 book ai didi

stack - 堆栈何时真正溢出?

转载 作者:行者123 更新时间:2023-12-03 18:16:59 25 4
gpt4 key购买 nike

无限递归是唯一的情况还是可能由于其他原因而发生?
堆栈大小是否与堆一样根据需要增长?

抱歉,如果之前有人问过这个问题,如果是这种情况,我们将不胜感激。

最佳答案

我不能代表所有平台,但碰巧的是,我刚刚花了一些时间处理 Windows .exe 文件(我的意思是,实际上研究它们的二进制格式 - 我知道从某种意义上说,我们这里的所有人都使用可执行文件;))。我敢打赌大多数其他平台都有类似的功能,但我对它们并不熟悉。

部分文件格式本身包括与当前讨论相关的两个值:

typedef struct _IMAGE_OPTIONAL_HEADER {
...
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
...
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

来自 MSDN:

SizeOfStackReserve

The number of bytes to reserve for the stack. Only the memory specified by the SizeOfStackCommit member is committed at load time; the rest is made available one page at a time until this reserve size is reached.

SizeOfStackCommit

The number of bytes to commit for the stack.



换句话说,链接器指定了程序堆栈的最大大小。如果您达到最大尺寸,您就会溢出 - 无论您如何达到最大尺寸。您可以编写一个简单的程序,只需分配一个大于最大堆栈大小的堆栈变量(例如,一个数组),就可以在一行代码中完成此操作。或者您可以通过无限(或有限,但非常深)递归来实现,或者仅通过分配太多堆栈变量来实现。

Microsoft 链接器在 X86 平台上默认将此值设置为 1MB(在 Itanium 系统上为 4MB)。从表面上看,这对于现代系统来说似乎很小。但是,更现代的 Windows 版本对这些值的解释略有不同。它没有完全限制堆栈,而是限制了 物理堆栈将使用的内存。如果您的堆栈增长超出此范围,则会涉及虚拟内存,因此您应该仍然很好……假设您有足够的虚拟内存。

记住,它 可能会耗尽内存,即使在具有大量 RAM 和磁盘上大量虚拟内存的现代系统上也是如此。您只需要分配非常大量的数据。

所以,长话短说:是否有可能在没有无限递归的情况下溢出堆栈?确实。有可能吗?不是真的,除非你正在分配非常大的对象。

关于stack - 堆栈何时真正溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1858053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com