C ++ Reserve Memory Space

时间:2010-03-22 14:26:04

标签: c++ windows optimization memory

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

5 个答案:

答案 0 :(得分:2)

当你拥有虚拟内存时,没有必要做这种事情。

答案 1 :(得分:0)

不含蓄。无法告诉C内存管理器(当您调用mallocnew时为您提供内存的内存管理器)以保留空间。

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


编辑 -
在Windows上,您可以使用VirtualAllocExVirtualFreeEx来请求Windows为您保留内存页面。但是没有办法告诉mallocnew使用这个记忆。如果你选择走这条路,你需要实现自己的内存管理器。

答案 2 :(得分:0)

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

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

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

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

你可以用完的东西就是你的地址空间。如果你分配100MB的块几次,再加上一些较小的块,那么在你将地址空间分段之前不久(默认情况下,它只给你足够的空间容纳大约20个这样的块,并且任何给定的块都必须适合一个连续的区域。)

答案 3 :(得分:0)

虽然这通常是一个非常糟糕的主意(正如其他人已经指出的那样),但Windows确实允许它。如果你真的坚持的话,请查看VirtualLock。至少有99%的时间,这是错误的做法,但它总是可能(尽管极不可能)你正在做的事情落入了证明它的一部分事情的一小部分

答案 4 :(得分:-1)

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

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

你当然必须确保你的平台以这种方式工作。充其量它虽然是不可移植的,但在最坏的情况下它不会伤害任何东西。

相关问题