2012-01-28 6 views
9

Ho due dubbi sul trattamento dei memmove():Come usare e quando è utile usare memmove in C?

  • Quando è uso preferibile questa funzione invece di usare un'altra funzione (cioè un creato propria funzione)? Non sono sicuro di aver capito bene.
  • La firma della funzione è void * memmove (void * dest, const void * src, size_t n). Se ho un semplice array arr [N], come posso inserirlo nella funzione chiamata? arr [N] o & arr [N]? La differenza è se la matrice è dichiarata con una dimensione iniziale o come un puntatore? Ho questo dubbio perché ho visto molti esempi in cui viene utilizzato entrambi.

Spero di aver spiegato i miei dubbi in senso positivo.

modifica: Devo eliminare un elemento dall'array e quindi voglio spostare i seguenti elementi di quello cancellato a sinistra.

+1

Pertinente. http://stackoverflow.com/questions/1960991/which-one-to-use-memmove-or-memcpy-when-buffers-dont-overlap –

risposta

13
  1. memmove può essere più veloce ma probabilmente non sarà mai più lento rispetto la propria funzione per copiare i dati in giro (di solito è codificato in assemblea con cura per spostare roba in giro nel modo più efficiente possibile sull'architettura corrente);
  2. dipende da cosa si vuole fare con quell'array ... se si vuole copiare il suo contenuto su un altro array arr sarà sufficiente (e, come parametro di lunghezza, si dovrebbe fare sizeof(*arr)*N dove N è il numero di elementi a copia).

A proposito, se la sorgente e la destinazione e la copia non sono sovrapposte, memcpy potrebbe essere più veloce.

Desidero eliminare un elemento dall'array e spostare a sinistra l'elemento della stessa matrice.

int arr[N]; 
/* ... */ 
/* Let's say you want to remove the element i (error checking on i omitted) */ 
memmove(arr+i, arr+i+1, (N-i-1)*sizeof(*arr)); 
/* or, if you prefer array indexing over pointer arithmetics: */ 
memmove(&arr[i], &arr[i+1], (N-i-1)*sizeof(*arr)); 

(sizeof(*arr) significa "ottenere la dimensione di un elemento della matrice")

+0

voglio cancellare un elemento dalla matrice e spostamento a sinistra l'elemento della stesso array. – Kyrol

+1

@Kyrol: risposta aggiornata. –

+2

Nota solo 'memcpy' può essere più veloce per i dati non sovrapposti; l'uso di 'memcpy' serve anche a documentare che stai copiando tra oggetti distinti anziché spostare elementi all'interno di un singolo oggetto di matrice. –

0

Quando è uso preferibile questa funzione invece di usare un'altra funzione (cioè una creata propria funzione)

È più veloce di una "funzione propria creata".

la firma della funzione è nullo * memmove (void * dest, const void * src, size_t n). Se ho un array arr semplice [N], come posso inserirlo nella funzione chiamata? arr [N] o & arr [N]

Solo arr?

+0

Cosa non hai capito della mia seconda domanda ?? Cerco di spiegarmi meglio. – Kyrol

4

memmove è come memcpy tranne che la destinazione e la matrice di origine possono sovrapporsi.

Con memcpy si promette che le aree geografiche non si sovrappongono e ciò consente all'implementazione di eseguire ulteriori ottimizzazioni.Quindi memcpy può essere più veloce di memmove.

La funzione memmove accetta un argomento di destinazione void * e un argomento di origine const void *. Significa che è possibile chiamare la funzione con l'argomento destinazione e origine del tipo di matrice perché verranno convertiti in tipi di puntatore. E dato che puoi assegnare qualsiasi tipo di puntatore a oggetti non qualificato a void * o const void *, non avrai bisogno di alcun cast quando chiami la funzione.

char src[1024] = {0}; 
char dst[1024]; 

memmove(dst, src, sizeof dst); 
/* src and dst don't overlap you should choose memcpy instead */ 
memcpy(dst, src, sizeof dst); 

Ora è solitamente meglio usare memcpy o memmove rispetto per codificare la propria funzione. In glibc per esempio, a seconda del set di istruzioni MCU e la dimensione per copiare, memcpy può essere sostituito dal compilatore con alcune versioni di assemblaggio veloce linea di memcpy.

+0

+1 per esempio. Grazie. – Kyrol

+0

e se src e dst sono la stessa matrice ?? perché il dubbio è se devo cancellare un elemento e spostare a sinistra gli altri elementi dopo quello cancellato. – Kyrol

+0

@Kyrol: ancora con l'esempio 'char src [1024] = {0}'. 'memcpy (src, src + 512, 512);' stesso oggetto ma le regioni non si sovrappongono: va bene. Ma 'memcpy (src + 256, src + 512, 512);' le regioni si sovrappongono, non va bene, usa invece 'memmove'. – ouah