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:
DESCRIPTIONThe 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.