No hay una función de biblioteca estándar afaik. Entonces, si estás escribiendo código portátil, estás viendo un bucle.
Si está escribiendo código no portátil, consulte la documentación de su compilador/plataforma, pero no contenga la respiración porque es raro obtener mucha ayuda aquí. Tal vez alguien más se involucrará con ejemplos de plataformas que proporcionan algo.
La forma en que escribiría la suya depende de si puede definir en la API que la persona que llama garantiza que el puntero dst estará lo suficientemente alineado para escrituras de 64 bits en su plataforma (o plataformas si es portátil). En cualquier plataforma que tenga un tipo de entero de 64 bits, malloc al menos devolverá punteros adecuadamente alineados.
Si tiene que lidiar con la falta de alineación, entonces necesita algo así como la respuesta de la sombra de luna. El compilador puede alinear/desenrollar esa memcpy con un tamaño de 8 (y usar operaciones de escritura no alineadas de 32 o 64 bits, si es que existen), por lo que el código debería ser bastante nippy, pero creo que probablemente no sea un caso especial toda la función para el destino está alineado. Me gustaría que me corrijan, pero temo que no lo seré.
Así que si sabe que la persona que llama siempre le dará un dst con suficiente alineación para su arquitectura, y una longitud que es un múltiplo de 8 bytes, entonces haga un bucle simple escribiendo uint64_t (o lo que sea el 64-bit int está en tu compilador) y probablemente (sin promesas) termines con un código más rápido. Seguramente tendrás un código más corto.
Cualquiera que sea el caso, si le importa el rendimiento, perfilelo. Si no es lo suficientemente rápido, inténtelo de nuevo con más optimización. Si todavía no es lo suficientemente rápido, formule una pregunta sobre una versión de ASM para la (s) CPU (s) en las que no es lo suficientemente rápido. memcpy/memset puede obtener aumentos de rendimiento masivos de la optimización por plataforma.
Esta implementación es más de lo que esperaba con la pregunta :) ¡Gracias! Hubiera sido bueno si explicaras la implementación. Por ejemplo, no puedo entender por qué usar una llamada de función a memcpy() en lugar de una asignación. – gnobal