Pregunta

memmove en realidad no se mueven de memoria no es así? Sólo la memoria copias de una región a otra y permite que esas dos regiones de solapamiento. Estoy haciendo esta pregunta porque yo sólo quiero saber por qué es esto FNC llamada en forma muy engañosa.
Para entiendo que cuando algo se mueve de un lugar a otro, la "cosita" es después de esta operación en el otro lugar y no en el primero. Y con memmove no funciona de esa manera. Estoy en lo cierto?

¿Fue útil?

Solución

Tiene usted razón, lo copia. Sin embargo, hay una diferencia entre memmove y memcpy, porque memmove puede tratar correctamente el caso cuando las memorias intermedias se superponen, por lo que es recomendable en estos casos.

Sin embargo, debido a comprobaciones adicionales que se lleva a cabo memmove, cuando las memorias intermedias son pequeñas y seguramente no se solapa, memcpy es mejor.

Otros consejos

La diferencia entre memcpy() y memmove() es que memmove() siempre es seguro de usar, independientemente de aliasing entre origen y destino. Es como si copias memmove() datos a un búfer temporal primero y luego al destino. memcpy() no ofrece garantías aliasing. que puede funciona como es debido, pero tal vez no. Si sabe tampones no puede solapamiento, memcpy() está bien, y puede en cualquier optimización del uso de la biblioteca, dado que le permiten ser más rápido que memmove(). En otro memcpy() biblioteca en realidad puede ser sólo memmove().

Si conoce src y dst no puede ser alias, es seguro de usar memcpy(). Si usted no sabe cuál se aplica a usted, el uso memmove().

La función se llama como tal porque si las regiones de memoria se copian hacer pasar a superponerse ya no es una copia, ya que el búfer original ya no se modifica. Por tanto, el búfer original debe ser considerado inutilizable. Dado que está utilizando no memmove memcpy esto es probable que sea el caso. Por lo tanto, la denominación tiene sentido:. Semánticamente que está moviendo los datos no copiarlo

memmove copia los datos de la fuente al destino. Se diferencia de memcpy en que se garantiza que funcione en la superposición de las regiones de memoria.

Sí, es realmente memmove memcpy con la capacidad de manejar bloques superpuestos. Digamos que tiene una matriz, y que desea insertar algunos nuevos elementos en el comienzo (o eliminar algunos artículos), entonces symantically lo que está haciendo es "Moving" los artículos (existentes o que quedan) de ida y vuelta - supongo, y en ese contexto, el nombre tiene sentido.

Sí, memmove es otra variación en la copia. Que no borra la memoria "movimiento" en el sentido de que los bytes originales ya no son lo que eran antes de la operación. Es específicamente para manejar el caso de la memoria solapado.

¿Cómo se hace esto depende de su arquitectura, pero lo he visto hacer de dos formas diferentes:

  • utilizar un búfer temporal con dos operaciones de tipo memcpy; o
  • copiar desde el primer byte de ir hacia delante o el último byte yendo hacia atrás, dependiendo del tipo de superposición (si lo hay).

Para responder a su pregunta sobre el nombre de memmove(): Creo que el nombre se pretende reflejar el apoyo para mover los rangos de elementos de una matriz a otra gama de la matriz (por ejemplo, para hacer espacio para un nuevo elemento en el inicio o en el interior la matriz).

Como otras respuestas mencionan, memcpy() puede utilizar técnicas de optimizaciones que no están disponibles para memmove() porque memcpy() no admite regiones de memoria que se solapan, mientras memmove() hace.

Una cosa es posible que desee considerar es todavía utilizar memmove() en lugar de memcpy() por defecto a menos que estés trabajando en una aplicación donde el rendimiento de copia es crítico. memcpy() puede proporcionar un mejor rendimiento (sobre todo porque puede inline con mayor eficacia, creo), pero tenga en cuenta esta cita sobre la implementación memcpy() en el núcleo de Linux de una discusión sobre el uso incorrecto de una aplicación de memcpy() de la biblioteca C:

En el núcleo, los x86 optimizados establecimiento de memoria que utilizamos es en realidad un memmove (), porque si bien el rendimiento es muy importante, por lo que es de repetibilidad y evitar sorpresas (en sentido estricto, tenemos dos: la versión "MOV rep" para el caso en que se supone que es rápido, y la versión en papel con código abierto. la versión "representante MOV" es de sólo hacia delante y no maneja áreas superpuestas).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top