因为*(void **)dest = *(void **)src;
!= memmove(dest, src, elementSize);
first 只是分配操作,其中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;
我低估了一些错误,
请在此处
考虑 larsmans 的回答
鉴于,通过这样做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 +--- | | | | |
+-----+ +--+--+--+---+
影印本:
来自:托马斯(谢谢!)
更具体地说,后一种技术被称为“指针交换”并且确实有其用途,但与深内存复制不直接兼容(它需要不同的设计,特别是被“交换”的两个内存区域需要持久) . 对于向量实现,它不太可能属于我们