从Linux联机帮助页memmove(3)为什么Linux memmove()以这种方式实现?
的的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;
}
在此实现,我们只是拿我们开始复制位置的照顾。
我的实施有没有缺点?
注意:我不会实际使用我的实现。我只是好奇。
当dest和src指向不同的块时,dest是未定义的行为。当'dest'和'src'指向同一个块时,函数'memmove()'被指定为工作,但没有指定它必须用指向同一个块的指针来调用。看到相关的问题http://stackoverflow.com/questions/4023320/how-to-implement-memmove-in-standard-c-without-an-intermediate-copy –
我想你错过了“好像”在手册页。它实际上并不这样。 – dbrank0
您可以将您的实现与[FreeBSD的'bcopy'](http://fxr.watson.org/fxr/source/string/bcopy.c?v=FREEBSD-LIBC),它们的memmove()的底层代码进行比较。它也支持向后复制,没有临时缓冲区。 – ShiDoiSi