因为*(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; 我的理解有些错误
考虑 larsmans 的 answer here
而,通过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 指向的内存区域(深拷贝)
dest = src点赞:
src 5 6 7 8
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ --->+--+--+--+---+
|
dest | 18 19 20 21
+-----+ | +--+--+--+---+
| 5 +--- | | | | |
+-----+ +--+--+--+---+
影印:
发件人:Thomas(谢谢!)
更具体地说,后一种技术称为“指针交换”
确实有它的用途,但不直接兼容 deep
内存副本(它需要不同的设计,尤其是两个
被“交换”的内存区域需要是持久的)。对于向量
实施它不太可能属于我们