这取决于操作系统。POSIX - 包括 Linux - 有系统调用madvise来提高内存性能。从手册页:
madvise() 系统调用建议内核如何处理地址范围内的分页输入/输出,地址范围从地址 addr 开始,大小为长度字节。它允许应用程序告诉内核它希望如何使用一些映射或共享内存区域,以便内核可以选择适当的预读和缓存技术。此调用不会影响应用程序的语义(MADV_DONTNEED 除外),但可能会影响其性能。内核可以随意忽略这些建议。
madvise有关更多信息,请参见手册页。
编辑:显然,上面的描述不够清楚。所以,这里有一些更多的细节,其中一些是特定于 Linux 的。
您可以使用它mmap来分配一块内存(直接来自操作系统而不是 libc),它不受任何文件的支持。对于大块内存,malloc正在做完全相同的事情。您必须使用munmap来释放内存 - 无论使用madvise:
void* data = ::mmap(nullptr, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// ...
::munmap(data, size);
如果你想摆脱这个块的某些部分,你可以使用madvise告诉内核这样做:
madvise(static_cast<unsigned char*>(data) + 7 * page_size,
3 * page_size, MADV_DONTNEED);
地址范围仍然有效,但不再受物理 RAM 和存储支持。如果您稍后访问这些页面,内核将动态分配一些新页面并将它们重新初始化为零。请注意,不需要的页面也是进程虚拟内存大小的一部分。可能需要对虚拟内存管理进行一些配置更改,例如激活过度提交。