[解決済み] memcpy()とmemmove()の比較
質問
との違いを理解しようとしています。
memcpy()
と
memmove()
という文章を読みました。
memcpy()
は送信元と送信先の重なりを考慮しないのに対して
memmove()
があります。
しかし、この2つの関数を重複するメモリーブロックに対して実行すると、どちらも同じ結果になってしまうのです。たとえば、次のMSDNの例で
memmove()
ヘルプページ:-)
の欠点を理解するのに良い例はないでしょうか?
memcpy
と、どのように
memmove
は、それを解決するのですか?
// crt_memcpy.c
// Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle
// it correctly.
#include <memory.h>
#include <string.h>
#include <stdio.h>
char str1[7] = "aabbcc";
int main( void )
{
printf( "The string: %s\n", str1 );
memcpy( str1 + 2, str1, 4 );
printf( "New string: %s\n", str1 );
strcpy_s( str1, sizeof(str1), "aabbcc" ); // reset string
printf( "The string: %s\n", str1 );
memmove( str1 + 2, str1, 4 );
printf( "New string: %s\n", str1 );
}
出力します。
The string: aabbcc
New string: aaaabb
The string: aabbcc
New string: aaaabb
解決方法は?
あなたの例が奇妙な挙動を示さないことに、私はまったく驚いていません。試しに
str1
を
str1+2
の代わりに、"C "をつけて、何が起こるか見てみましょう。(実際には違いが出ないかもしれません。コンパイラやライブラリに依存します。)
一般に、memcpyはシンプルな(しかし高速な)方法で実装されています。単純に言えば、データを(順番に)ループして、ある場所から別の場所にコピーするだけです。このため、読み込み中にソースが上書きされることがあります。
Memmoveは、オーバーラップを正しく処理するために、より多くの作業を行います。
EDIT
(残念ながら、まともな例が見つからないが、これでいいだろう)。対照的に memcpy と メモムーブ memcpyは単にループするだけですが、memmoveはデータの破損を避けるためにループする方向を決定するテストを行います。これらの実装はかなり単純なものです。ほとんどの高性能な実装はもっと複雑です(バイトではなくワードサイズのブロックを一度にコピーすることが含まれます)。
関連
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?
-
[解決済み] memmoveとmemcpyの違いは何ですか?
-
[解決済み] memcpy()とmemmove()をバイト数をゼロにして呼び出すことは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
ポインタ定数および定数ポインタ
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] memmoveとmemcpyの違いは何ですか?