C++ C++;保留内存空间

C++ C++;保留内存空间,c++,windows,optimization,memory,C++,Windows,Optimization,Memory,有没有办法在默认Windows内存管理器中保留内存空间供以后使用,这样,如果我的程序使用的空间不超过我在程序开始时保留的空间,我的应用程序就不会耗尽内存?当你有虚拟内存时,这样做没有意义。不是隐式的。无法告诉C内存管理器(在调用malloc或new时提供内存的管理器)保留空间 您可以使用自己的专用分配器或缓冲池,手动管理分配和内存保留 编辑- 在windows上,您可以使用VirtualAllocEx和VirtualFreeEx要求windows为您保留内存页。但是没有办法告诉malloc和n

有没有办法在默认Windows内存管理器中保留内存空间供以后使用,这样,如果我的程序使用的空间不超过我在程序开始时保留的空间,我的应用程序就不会耗尽内存?

当你有虚拟内存时,这样做没有意义。

不是隐式的。无法告诉C内存管理器(在调用
malloc
new
时提供内存的管理器)保留空间

您可以使用自己的专用分配器或缓冲池,手动管理分配和内存保留


编辑-

在windows上,您可以使用
VirtualAllocEx
VirtualFreeEx
要求windows为您保留内存页。但是没有办法告诉
malloc
new
使用这个内存。如果你选择走这条路,你需要实现你自己的内存管理器。

这甚至不是远程可移植的,但在许多系统中,你分配的内存在释放时不会返回到操作系统,它只是放回到该程序的可用列表中

因此,如果在程序启动时分配一个足够大的块,然后立即释放它,那么从那时起,内存分配器就可以在该程序中分配内存了


不过,您肯定必须确保您的平台以这种方式工作。虽然在最好的情况下它是不可移植的,但在最坏的情况下它不应该损害任何东西。

在任何给定的时刻,您的应用程序都不一定有任何物理内存

如果您的应用程序等待IO操作一段时间,并且用户开始编辑视频,则您的应用程序可能会从物理内存中完全消失。它只存在于页面文件中。当IO操作完成并且其中一个线程需要重新开始运行时,您将获得一些物理内存

您真正需要分配的只是进程地址空间的一部分。它的一部分可能会映射到文件(例如,您的EXE或任何不需要重新设置基础的本机DLL)。其他部分可能是“内存分配”,但实际上这只是意味着它们映射到页面文件中的位置

在任何可靠的意义上,这些都不是“真正的”记忆


你肯定会用完地址空间的空间。如果你分配100MB的数据块几次,再加上几个较小的数据块,你很快就会将地址空间分割成碎片(默认情况下,地址空间只能容纳20个这样的数据块,任何给定的数据块都必须放入一个相邻的区域)。

尽管这通常是一个非常糟糕的主意(正如其他人已经指出的那样),是的,Windows允许。如果你真的坚持,请向上看。至少99%的情况下,这样做是错误的,但你所做的事情总是有可能(尽管可能性极低)落入证明其合理性的事情的一小部分。

我只想做一些优化,虚拟内存速度较慢,因为它涉及磁盘读取/write@uray:Paul的观点是,虚拟内存系统不会告诉您何时内存已满,是时候开始使用“reserve”了,而是让您保留“reserve”并开始分页。这就出现了您试图避免的“使用基于磁盘的慢速内存”的情况。顺便说一句,这与不太复杂的内存系统(如Mac System 6所使用的内存系统)形成了鲜明的对比,在Mac System 6中,您可以提前获取一个保留内存块,以便在第一次分配返回为“内存不可用”时释放它会让你继续(尽管优雅地失败会更安全)。@Paul R:也许你可以另外回答后续问题,“是否可以保留和提交内存”?当然,虚拟内存的问题基于一个错误的前提,即为程序“保留”内存是可能的。但是JB描述了一个有效的问题,很可能是这个提问者的问题,也可能是将来通过搜索找到这个问题的人的问题。如果有人不明白虚拟内存会使为进程“保留”空间变得毫无意义,那么他们也不会知道找到合适答案的神奇词语是“提交”。“毫无疑问,它在某处被使用过”。Windows将其称为提交,例如,将MEM_COMMIT参数称为VirtualAlloc。这是用一些东西来支持虚拟地址范围,不一定是物理RAM。可以是swap/pagefile。但是我看到你从提问者那里挑逗出来,目的是某种模糊的绩效改进,所以在这个例子中,我认为你是对的,没有任何意义。如果JB想考虑他的建议,那是另一个问题:-)我不是严格要求C内存管理器,有没有Win32/64可以这样做?谢谢你的建议,我不关心这种情况下的可移植性。这在VM操作系统中更可能产生相反的效果。您只会浪费页面表条目和TLB条目,您将更快地开始页面。整个预分配的想法是非常古老的skool——从PC操作系统没有虚拟机的日子开始,只有一个有限的物理内存池,在所有进程之间共享。嗯?虚拟机并不神奇,任何类型的可用内存资源都是有限的。如果您将一些资源预先分配给特定的进程,那么您知道稍后您将拥有该进程所需的内存。当然,这可能会导致额外的分页,但这是在任何系统上保留部分内存的成本。我看不出除非标准库将分配的内存释放回操作系统,否则这怎么会不起作用呢?请注意其中的一部分,它说:“当应用程序需要更多堆空间时,较高的提交值可以节省时间,但会增加内存需求,可能还会增加启动时间。”@paul:因此,通过提高提交值,我可以提高运行速度,但降低启动速度+增加内存需求?如果你提前知道的话