2012-01-28 38 views
9

tengo dos dudas sobre el uso de memmove():Cómo usar y cuándo es bueno usar memmove en C?

  • Cuando es preferible el uso de esta función en lugar de utilizar otra función (es decir, un creados propia función)? No estoy seguro de haber entendido bien.
  • La firma de la función es void * memmove (void * dest, const void * src, size_t n). Si tengo un arreglo simple arr [N], ¿cómo puedo ponerlo en la función llamada? arr [N] o & arr [N]? La diferencia es si la matriz se declara con un tamaño inicial o como un puntero? Tengo esta duda porque vi muchos ejemplos donde se usan ambos.

Espero haber explicado mis dudas de una buena manera.

editar: Tengo que eliminar un elemento de la matriz, y luego quiero desplazar los siguientes elementos de la eliminada a la izquierda.

+1

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

Respuesta

13
  1. memmove puede ser más rápido, pero probablemente nunca habrá más lento que su propia función para copiar datos en todo (por lo general es codificado en el montaje cuidadosamente diseñado para mover cosas alrededor de la manera más eficiente posible en la arquitectura actual);
  2. depende de lo que quieras hacer con esa matriz ... si quieres copiar su contenido a otra matriz arr será suficiente (y, como parámetro de longitud, debes hacer sizeof(*arr)*N donde N es el número de elementos para dupdo).

Por cierto, si la fuente y el destino y la copia no se superponen memcpy pueden ser más rápidos.

Quiero eliminar un elemento de la matriz y desplazar a la izquierda el elemento de la misma matriz.

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 "obtener el tamaño de un elemento de la matriz")

+0

Quiero eliminar un elemento de la matriz y desplazar a la izquierda el elemento de la matriz mismo conjunto. – Kyrol

+1

@Kyrol: respuesta actualizada. –

+2

Nota: solo 'memcpy' puede ser más rápido para datos que no se superponen; el uso de 'memcpy' también sirve para documentar que está copiando entre objetos distintos en lugar de desplazar elementos dentro de un solo objeto de matriz. –

0

Cuando es el uso preferible esta función en lugar del uso de otra función (es decir, una creada propia función)

Es más rápido que una "función propia creada".

la firma de la función es nula * memmove (void * dest, const void * src, size_t n). Si tengo una matriz simple arr [N], ¿cómo puedo ponerla en la función llamada? arr [N] o & arr [N]

Just arr?

+0

¿Qué no entendiste sobre mi segunda pregunta? Intento explicarme mejor. – Kyrol

4

memmove es como memcpy, excepto que el destino y la matriz de origen se pueden superponer.

Con memcpy promete que las regiones no se superponen, lo que permite que la implementación realice algunas optimizaciones adicionales.Entonces memcpy puede ser más rápido que memmove.

La función memmove toma un argumento de destino void * y un argumento fuente const void *. Significa que puede llamar a la función con argumento de origen y destino del tipo de matriz porque se convertirán a tipos de puntero. Y como puede asignar cualquier tipo de puntero de objeto no calificado a void * o const void *, no necesitará ningún molde para llamar a la función.

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); 

Ahora por lo general es mejor utilizar memcpy o memmove que a codificar su propia función. En glibc, por ejemplo, dependiendo del conjunto de instrucciones MCU y el tamaño para copiar, memcpy puede ser reemplazado por el compilador con algunas versiones rápidas de montaje en línea de memcpy.

+0

+1 por ejemplo. Gracias. – Kyrol

+0

y si src y dst son la misma matriz? porque la duda es si tengo que eliminar un elemento y desplazar los otros elementos después del borrado. – Kyrol

+0

@Kyrol: todavía con el ejemplo 'char src [1024] = {0}'. 'memcpy (src, src + 512, 512);' el mismo objeto pero las regiones no se superponen: eso está bien. Pero las regiones 'memcpy (src + 256, src + 512, 512);' se superponen, eso no está bien, use 'memmove' en su lugar. – ouah

Cuestiones relacionadas