memcpy/memmoveは、ソースからデスティネーションへの複製(データのコピー)です。実際のバイト単位でソースデータをコピーせずに、ある仮想アドレスから別の仮想アドレスにページを移動するには何かが存在しますか?私には完全に可能なようですが、どのオペレーティングシステムでも実際にこれが可能ですか?ダイナミックアレイは広く普及している概念ですが、物理的にコピーすることで成長させることは、無駄な操作です。あなたはギガバイトで、配列のサイズについて話し始めるとき、それはちょうど例えば200ギガバイトの配列に100ギガバイトの配列を成長想像(拡張できません。それは今< $ 10Kの範囲内のサーバー上で完全に可能だ問題だ。OSは物理的にコピーせずにあるアドレスから別のアドレスに移動することを許可していますか?
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)
これはまさに私が探しているようです。私はこれをlinuxと他の場所の標準的なダムのメモリコピーで使うことができます。 – Eloff
またはreallocと同様の方法をボンネットの下で使用することを希望します。 :) – onitake