*(void **)dest = *(void **)src;
!= memmove(dest, src, elementSize);
最初は単なる代入操作であり、memmove()
メモリの内容をコピーsrc
するため(dest
ディープコピー)
編集
あなたのdest
と src
がこのようなものだとします。
src 5 6 7 8
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ +--+--+--+---+
dest 18 19 20 21
+-----+ +--+--+--+---+
| 18 +----->| | | | |
+-----+ +--+--+--+---+
さて、何*(void **)dest = *(void **)src;
?
好き
src 5 6 7 8
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ +--+--+--+---+
dest 18 19 20 21
+-----+ +--+--+--+---+
| 18 +----->| A| | | |
+-----+ +--+--+--+---+
代入により、ロケーション 5 のコンテンツ (* を使用するため) をロケーション 18 にコピーするためです。
*(void **)dest = *(void **)src;
私の控えめな表現に何か問題があるため
、ここで
ラースマンの答えを検討してください。
一方、次のように実行しmemmove(dest, src, elementSize);
ます。
好き
src 5 6 7 8
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ +--+--+--+---+
dest 18 19 20 21
+-----+ +--+--+--+---+
| 18 +----->| A|B |C | |
+-----+ +--+--+--+---+
=としelementSize
ます。3
memmove elementSize
src から dest が指すメモリ領域に要素をコピーします (deepcopy)
好きなことでdest = src
:
src 5 6 7 8
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ --->+--+--+--+---+
|
dest | 18 19 20 21
+-----+ | +--+--+--+---+
| 5 +--- | | | | |
+-----+ +--+--+--+---+
シャドウ コピー:
From:トーマス(ありがとう!)
より具体的には、後者の手法は「ポインタ スワッピング」として知られており、その用途はありますが、ディープ メモリ コピーとは直接互換性がありません (別の設計が必要です。特に、「スワップ」される 2 つのメモリ領域が永続的である必要があります)。 . ベクトル実装の場合、私たちのものになる可能性はほとんどありません