重複の可能性:
memcpyとmemmove
memmoveは実際にメモリのチャンクを「移動」しますか?もしそうなら、それはゼロでメモリを残しますか?それとも、memcpyのようなものですか?私はmanページを見ていますが、私の仮定が正しいとは思いません。memmoveを使用してメモリのチャンクを移動したい場合、移動を行ったメモリのチャンクを手動でゼロにする必要がありますか?
そうではありません:
との主な違いは、memmove
移動しようとしているメモリ ブロックと重複する場所にメモリの一部を再配置するために使用できることです。したがって、元のポインターは無効になります。memcpy
memmove
memcpy
一方、 では、2 つの領域が重なることはありません。
memmove
ただし、元のメモリ ブロックはゼロにしません。それを行いたい場合は、memsetを使用して明示的に自分で行う必要があります。原則として、C ルーチンは、メモリをゼロにするなど、不要な処理を行ってサイクルを浪費しません。malloc
同様にメモリブロックをゼロにしない と比較してください。
memmove
古いメモリをクリアすることとは何の関係もありません。実際、使用したい唯一の状況ではmemmove
、古いメモリをクリアすると、コピーしたばかりのデータが破壊されます! これmemmove
は、ソース範囲と宛先範囲が重複することが予想される場合にのみ役立つためです。
通常、 が必要memmove
な場合は、設計に重大な根本的な非効率性があることを示しています。たとえば、新しい C プログラマーは、文字列の末尾にorを使用するだけでなくmemmove
、文字列の最初の数文字を削除するために を使用しようとすることがよくあります (例: )。ほとんど含まれていないアルゴリズムは、O(n^2) よりも優れたパフォーマンスを発揮します。memmove(s, &s[1], len)
s+1
&s[1]
memmove