因为*(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 +--- | | | | |
+-----+ +--+--+--+---+
影印本:
来自:托马斯(谢谢!)
更具体地说,后一种技术被称为“指针交换”并且确实有其用途,但与深内存复制不直接兼容(它需要不同的设计,特别是被“交换”的两个内存区域需要持久) . 对于向量实现,它不太可能属于我们