c++如何从RAM中取消未使用的全局数组?



在c++中,当你声明一个大数组时,比如500MB,它不会立即映射到RAM,因为它还没有被使用。当我第一次从数组访问一个页面时,它就被映射到物理内存中。现在系统知道我正在使用那个页面,但是我如何告诉系统我不再使用某个页面并且它可以随意取消它的映射?

在我的例子中,我只需要偶尔,所以不是所有的时间,填充一个大数组并对其进行快速随机访问。现在我可以每次都使用malloc,但我为什么要这样做呢?有很多方法可以告诉系统您不需要某个页面,但是它们都可以从物理空间虚拟空间中取消对该页面的映射。我只是想把它从物理空间中移除。这是不可能的吗?

你不需要做任何特别的事情。

内存管理单元根据需要自动将虚拟内存页移进和移出物理RAM。如果一个页面有一段时间没有被使用,并且它的内存需要用于其他事情,那么它将被换出。物理RAM保存最近使用过的页面,如果旧的页面由文件(例如程序的文本段)支持,那么它们只是被驱逐,或者它们被写入磁盘的交换区然后被驱逐。

当你用完整个数组时,你应该用delete[]释放它。根据内存分配器的设计,这可能会或可能不会从虚拟内存中删除内存页,但是您没有任何直接控制。

如果你在谈论一个静态数组,没有办法表明你已经完成了它。如果您需要这样做,则必须使用new动态分配数组,以便您可以delete它。

经过大量的研究,幸运的是,我发现了另一个帖子,其中暴露了使用mmap()MAP_ANON|MAP_SHARED选项来分配数组和madvise()MADV_REMOVE选项的技巧。您可以查看手册页了解详细信息。

最新更新