memcpy/memmove (verileri kopyalayın) kaynağından hedefe kopyalayın. Kaynak verilerin bayt kopyasıyla gerçek bir bayt yapmadan sayfaları bir sanal adresten diğerine taşımak için herhangi bir şey var mı? Bana tamamen mümkün görünüyor, ama herhangi bir işletim sistemi buna gerçekten izin veriyor mu? Dinamik dizilerin bu kadar yaygın ve popüler bir kavram olduğu, ancak fiziksel olarak kopyalayarak bunları büyütmenin böylesine savurgan bir işlem olduğu bana tuhaf geliyor. Eğer (örneğin 200GB diziye 100GB dizi büyüyen düşünün. Bu artık < $ 10K aralığında sunucularda tamamen mümkün bir sorun.Herhangi bir işletim sistemi, belleği fiziksel olarak kopyalamadan bir adresten diğerine taşımaya izin veriyor mu?
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)
Bu, tam olarak aradığım şey gibi görünüyor. Bunu linux ve her yerde standart bir aptal hafıza üzerinde kullanabilirim. – Eloff
Veya bir realloc ve umarım kaputun altında benzer bir yöntem kullanır. :) – onitake