memcpy/memmove duplicar (copiar los datos) desde el origen hasta el destino. ¿Existe algo para mover páginas de una dirección virtual a otra sin hacer una copia de byte real por byte de los datos de origen? Parece ser perfectamente posible para mí, pero, ¿algún sistema operativo realmente lo permite? Me parece extraño que los arreglos dinámicos sean un concepto tan extendido y popular, pero que hacerlos crecer copiando físicamente es una operación tan inútil. Simplemente no escala cuando se empieza a hablar acerca de los tamaños de matriz en los gigabytes (por ejemplo, imaginar el crecimiento de una gama de 100 GB en una matriz de 200 GB. Ese es un problema que es muy posible en los servidores de gama < $ 10K ahora.¿Algún sistema operativo permite mover la memoria de una dirección a otra sin copiarla físicamente?
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)
Parece que es exactamente lo que estoy buscando. Podría usar esto en Linux y una copia de memoria estúpida estándar en cualquier otro lugar. – Eloff
O un realloc y espero que use un método similar debajo del capó. :) – onitake