Vom Linux-Manpage memmove(3)Warum wird Linux memove() so implementiert, wie es ist?
Die memmove() Funktion kopiert n Bytes aus dem Speicherbereich src zum Speicherbereich dest. Die Speicherbereiche können sich überlappen: Der Kopiervorgang erfolgt so, als ob die Bytes in src zuerst in ein temporäres Array kopiert werden, das src oder dest nicht überlappt, und die Bytes werden dann vom temporären Array nach dest kopiert.
stattdessen eine temporäre Anordnung der Zuteilung und kopieren Sie die Werte zweimal konnten wir nur Folgendes tun:
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;
}
In dieser Implementierung einfach wir kümmern uns um die Position bringen, wo wir zu kopieren beginnen.
Gibt es einen Nachteil in meiner Implementierung?
Hinweis: Ich werde meine Implementierung nicht verwenden. Ich bin nur Neugierig.
'dest
Ich denke, Sie haben "wie" in Manpage verpasst. Es funktioniert nicht so. – dbrank0
Sie können Ihre Implementierung mit [FreeBSDs 'bcopy'] (http://fxr.watson.org/fxr/source/strc/copy.c?v=FEBEBSD-LIBC), dem zugrunde liegenden Code für ihre memmove(), vergleichen. Es unterstützt auch das Kopieren rückwärts ohne einen temporären Puffer. – ShiDoiSi