为什么Linux memmove()以它的方式实现?

从memmove的Linux 手册(3)

memmove()函数将n个字节从内存区域src复制到内存区域dest。 存储区可能重叠:复制发生就像src中的字节首先被复制到一个不与src或dest重叠的临时数组中,然后将字节从临时数组复制到dest。

不是分配临时数组并将值复制两次,我们可以执行以下操作:

void *my_memmove(void *dest, const void *src, size_t n) { signed char operation; size_t end; size_t current; if(dest != src) { if(dest < src) { operation = 1; current = 0; end = n; } else { operation = -1; current = n - 1; end = -1; } for( ; current != end; current += operation) { *(((unsigned char*)dest) + current) = *(((unsigned char*)src) + current); } } return dest; } 

在这个实现中,我们只关注我们开始复制的位置。

我的实施有缺点吗?

注意:我实际上不会使用我的实现。 我只是好奇。

你可以在这里 , 这里 , 这里和这里看一些memmove的源代码。

您会注意到它们实际上并不构成临时数组。 编写手册页是为了帮助您理解逻辑上的内容 ,而不是实际上 。 因此,他们说“好像”。

memmove()实际上做的是将字节从src复制到dest ,如果dest < src (它与memcpy基本相同)则向前复制,否则向后复制。

memcpymemmove之间的区别在于memcpy盲目地向前复制 - 这就是destsrc不应该重叠的原因。 但memmove采取预防措施,确保重叠不会搞砸最终结果。