gpt4 book ai didi

c - Windows是否回收堆栈空间?

转载 作者:可可西里 更新时间:2023-11-01 13:52:40 26 4
gpt4 key购买 nike

我正在做一种叫做“堆叠绘画”的技术。确定特定函数使用了多少堆栈空间。

如果我在堆栈上分配 1MB 的项目。然后确保我没有使用堆栈中的任何这些项目。 Windows 自动取消提交(释放)那些未使用的页面吗?

我特别想知道 Windows 的 VMM。关于页面是否提交或不一定提交但只是保留

换句话说,如果我手动访问 1MB 的内存,Windows 可能会抛出访问冲突?

最佳答案

您不会删除在堆栈上分配的内容;它会自动回收,因为当您退出当前作用域时,堆栈指针会移回前一个堆栈帧1,因此当前作用域中用于对象的所有内存都被有效回收。

原则上,所有堆栈都是在应用程序加载到内存中时分配的,因此它是一个固定大小的结构,可以反复重用(当代码流进出范围时);操作系统可能会玩一些聪明的把戏(通过使用保护页来提交堆栈的上部,这些部分只是在应用程序启动时保留的),但通常这不应该让您担心。

堆栈大小是 PE header (可执行文件的 header )的一部分,您可以使用链接器选项设置它。您可以通过窥探内存中加载的 PE 结构来检索已加载可执行文件的此类值(基本上它的 HMODULE 是可执行文件在内存中映射的位置);我认为 ImageHelper 库可用于此任务。


  1. 自然地,在析构函数运行之后;顺便说一句,FPO 可以在这里稍微改变一下,但概念保持不变。

编辑

In otherwords, if I manually access the memory down to that 1MB may windows throw an Access Violation?

如果它已经被提交(即您在堆栈上分配和释放了 1 MB 的对象),我认为它不会发生。

Windows 不会知道堆栈的那部分不再使用。 Windows 可以检测是否需要提交更多页面,使用保护页面检测对堆栈上部的访问,但它无法知道这些页面不再被使用。

实际上它可以在上下文切换时查找堆栈指针,但它会破坏使用堆栈做“聪明”事情的应用程序,并且通常这是一种不值得努力的优化:如果没有内存这些页面仍然可以被调出。

仍然,为了安全起见(例如,如果您不知道分配是否已经发生),您应该从当前使用的部分向上读取堆栈,因此如果向上的页面尚未提交,您会仍然触摸保护页面,提醒 Windows 为堆栈提交更多页面。

关于c - Windows是否回收堆栈空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358754/

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