是否允许任何操作系统将内存从一个地址移动到另一个地址而不进

Elo*_*off 5 c c++ linux windows operating-system

memcpy/memmove从源复制(复制数据)到源.是否存在将页面从一个虚拟地址移动到另一个虚拟地址而不进行源数据的实际逐字节复制的情况?对我来说似乎完全可能,但是任何操作系统实际上都允许这样做吗?对我来说,动态阵列是如此广泛和流行的概念似乎很奇怪,但通过物理复制来增长它们是一种浪费的操作.它只是当你开始谈论在千兆字节数组的大小不能扩展(如想象成长100GB的阵列到阵列200GB,这是这是完全有可能对在<$ 10K系列服务器现在的一个问题.

void* very_large_buffer = VirtualAlloc(NULL, 2GB, MEM_COMMIT);
// Populate very_large_buffer, run out of space.
// Allocate buffer twice as large, but don't actually allocate 
// physical memory, just reserve the address space.
void* even_bigger_buffer = VirtualAlloc(NULL, 4GB, MEM_RESERVE);
// Remap the physical memory from very_large_buffer to even_bigger_buffer without copying
// (i.e. don't copy 2GB of data, just copy the mapping of virtual pages to physical pages)
// Does any OS provide support for an operation like this?    
MoveMemory(very_large_buffer, even_bigger_buffer, 2GB)
// Now very_large_buffer no longer has any physical memory pages associated with it
VirtualFree(very_large_buffer)
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 6

在某种程度上,你可以mremap在Linux上做到这一点.

如果可以的话,该调用将与进程的页表一起进行零拷贝重新分配.在所有情况下都不可能(地址空间碎片,并且仅存在其他现有映射是一个问题).

手册页实际上是这样说的:

mremap()更改虚拟地址和内存页面之间的映射.这可用于实现非常有效的realloc(3).