c++ - allocate - ¿Cuál usar-memmove() o memcpy()-cuando los buffers no se superponen?
malloc c++ (4)
El uso de memcpy()
cuando la superposición de origen y destino puede conducir a un comportamiento indefinido, en esos casos solo se puede usar memmove()
.
Pero, ¿qué sucede si sé con certeza que los almacenamientos intermedios no se superponen? ¿Existe alguna razón para usar específicamente memcpy()
o específicamente memmove()
? ¿Qué debería usar y por qué?
Asumiendo un implementador de biblioteca cuerdo, memcpy
siempre será al menos tan rápido como memmove
. Sin embargo, en la mayoría de las plataformas, la diferencia será mínima, y en muchas plataformas, memcpy
es solo un alias para que memmove
admita el código heredado que (incorrectamente) llama a memcpy
en la superposición de búferes.
Tanto memcpy
como memmove
deberían escribirse para aprovechar las cargas y tiendas más rápidas disponibles en la plataforma.
Para responder a su pregunta: debe usar la que es semánticamente correcta. Si puede garantizar que los buffers no se superpongan, debe usar memcpy
. Si no puede garantizar que los búferes no se superpongan, debe usar memmove
.
En alguna plataforma ARM en la que estoy trabajando, memmove era 3 veces más rápido que memcpy para carga corta no alineada. Como memcpy y memmove son el único mecanismo de tipografía realmente portátil, hubieras pensado que el compilador verificaría algo antes de intentar usar el NEON para hacerlo.
Si está interesado en cuál funcionará mejor, debe probarlo en la plataforma de destino . Nada en el estándar ordena cómo se implementan las funciones y, si bien puede parecer lógico que una memcpy
no controladora sea más rápida, esto de ninguna manera es una certeza.
Es bastante posible, aunque poco probable, que la persona que escribió memmove
para su compilador en particular fuera un genio certificado, mientras que la pobre alma que consiguió el trabajo de escribir memcpy
era la idiota del pueblo :-)
Aunque, en realidad, me resulta difícil imaginar que el memmove
sea más rápido que memcpy
, no memcpy
la posibilidad. Mida, no adivine.
memcpy()
no tiene ningún manejo especial para la superposición de búferes, por lo que carece de algunos controles, por lo tanto, es más rápido que memmove()
.
También en algunas arquitecturas, memcpy()
puede beneficiarse del uso de instrucciones de la CPU para mover bloques de memoria, algo que memmove()
no puede usar.