Discussione: [C++] funzione memcpy
View Single Post
Old 30-05-2006, 20:52   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da 71104
il codice è sbagliato perché non tieni conto degli overlaps
Appositamente non ho tenuto conto dell'overlap, per 2 motivi: (a) perché il mio codice voleva essere un semplice esempio (senza alcuna pretesa di essere perfetto o super-efficiente ) di come copiare più byte per volta in linguaggio "C" per velocizzare un pochino la copia. (b) per il motivo seguente.

Quote:
Originariamente inviato da 71104
mentre la versione originale lo fa
No, una implementazione della memcpy non è obbligata a gestire l'overlap. Ad esempio su linux il man dice:
Quote:
DESCRIPTION
The memcpy() function copies n bytes from memory area src
to memory area dest. The memory areas may not overlap.
Use memmove(3) if the memory areas do overlap.
Su alcune implementazioni potrebbe gestire l'overlap ma non è mandatorio. L'unica funzione il cui funzionamento è garantito anche con l'overlap è memmove.

Quote:
Originariamente inviato da 71104
2) gli Intel hanno istruzioni che fanno tutto il lavoro; guarda per esempio le varie versioni di REP MOVS
Vero.

Quote:
Originariamente inviato da 71104
credo che tengano anche conto degli overlaps
No, o per dire meglio "ni". Dati i due puntatori (E)SI e (E)DI, questi vengono incrementati o decrementati entrambi in base al flag DF (0=incremento, 1=decremento). Non è quindi la REP MOVS a gestire per conto suo l'overlap! Al massimo può essere l'applicazione che controlla se c'è overlap e quindi aggiusta i 2 puntatori e la direzione.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso