Dalla pagina di manuale Linux per memmove(3)Perché Linux memmove() è implementato così com'è?
I memmove) copie (funzione n byte da un'area di memoria src per area di memoria dest. Le aree di memoria possono sovrapporsi: la copiatura avviene come se i byte in src fossero prima copiati in una matrice temporanea che non si sovrappone a src o dest, e quindi i byte vengano copiati dall'array temporaneo a dest.
Invece di allocare una matrice temporanea e copiare i valori due volte potremmo effettuare le seguenti operazioni:
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 questa implementazione semplicemente occupiamo della posizione in cui si comincia a copiare.
C'è un inconveniente nella mia implementazione?
Nota: in realtà non userò la mia implementazione. Sono solo curioso.
'dest
Penso che tu abbia perso "come se" nella manpage. In realtà non funziona in questo modo. – dbrank0
Puoi confrontare la tua implementazione con [FreeBSD's 'bcopy'] (http://fxr.watson.org/fxr/source/string/bcopy.c?v=FREEBSD-LIBC), il codice sottostante per il loro memmove(). Supporta anche la copia all'indietro, senza un buffer temporaneo. – ShiDoiSi