C ++保留内存空间

是否有任何方法来保留内存空间,以便默认情况下使用Windows内存pipe理器,以便我的应用程序不会耗尽内存,如果我的程序没有使用超过我在程序开始时保留的空间?

当你有虚拟内存时,做这种事情没有意义。

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

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

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

从任何可靠的角度来看,它都不是“真正的”记忆。

你当然可以耗尽的东西就是你的地址空间。 如果你几次分配100MB数据块,再加上几个较小的数据块,那么在你分割地址空间之前(默认情况下,只给你足够的空间容纳大约20个这样的数据块,而任何给定的块必须适合一个连续区域)。

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

不是隐含的。 没有办法告诉C内存管理器(当你调用mallocnew时给你内存的那个)来保留空间。

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


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

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

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

你一定要确保你的平台以这种方式工作。 尽管如此,最好还是不可移植的,但最糟糕的是它不应该伤害任何东西。