¿Qué hace este código C ?

void Send(int * to, const int* from, const int count) { int n = (count+7) / 8; switch(count%8) { case 0: do { *to++ = *from++; case 7: *to++ = *from++; case 6: *to++ = *from++; case 5: *to++ = *from++; case 4: *to++ = *from++; case 3: *to++ = *from++; case 2: *to++ = *from++; case 1: *to++ = *from++; } while (--n>0); } } 

Este es el Dispositivo de Duff para copiar memorias intermedias de memoria.

Este es el dispositivo de Duff . Es un método de desenrollar bucles que evita tener que agregar un bucle de reparación secundario para lidiar con los tiempos cuando no se sabe que el número de iteraciones de bucles es un múltiplo exacto del factor de desenrollado.

Dado que la mayoría de las respuestas aquí parecen ser positivas en general, voy a hablar en contra de eso.

Con este código, un comstackdor tendrá dificultades para aplicar cualquier optimización al cuerpo del bucle. Si acaba de escribir el código como un bucle simple, un comstackdor moderno debería ser capaz de manejar el despliegue por usted. De esta manera, mantiene la legibilidad y el rendimiento y tiene la esperanza de que se apliquen otras optimizaciones al cuerpo del bucle.

El artículo de Wikipedia mencionado por otros incluso dice que cuando se eliminó este ‘patrón’ del rendimiento del código fuente Xfree86 realmente mejoró.

Este resultado es típico de la optimización manual a ciegas de cualquier código que creas que pueda necesitarlo. Impide que el comstackdor haga su trabajo correctamente, hace que el código sea menos legible y más propenso a errores y, por lo general, lo ralentiza. Si estaba haciendo las cosas bien en primer lugar, es decir, escribiendo un código simple, luego creando perfiles para los cuellos de botella, y luego optimizando, nunca pensaría usar algo como esto. No con una CPU y un comstackdor modernos de todos modos.

Está bien entenderlo, pero me sorprendería si alguna vez realmente lo usa.

Esta mezcla de una statement de conmutación y un ciclo while se denomina “Dispositivo de Duff”. Es una forma de desenrollar bucles, que era una optimización utilizada a menudo en épocas anteriores.

Por lo tanto, este código aún copia los contenidos de la memoria de un lugar a otro, pero podría ser más eficiente. Tenga cuidado, en las architectures de hoy en día siempre debe medir eso, porque con la ubicación de caché y CPUs deslumbrantemente rápidas, desenrollar bucles es a menudo una mala idea.

Esto es funcionalmente idéntico al código a continuación:

 for(int i=0;i 

La diferencia es que su código desenrolla el bucle de modo que solo se requiere una iteración de bucle por cada 8 enteros copiados. Como no hay interrupciones para ninguno de los casos , la ejecución se realiza desde la etiqueta de cada caso hasta la siguiente.

Cuando count% 8 == 0, se ejecutan 8 copias dentro del ciclo para la primera iteración

cuando count% 8 == 7, se ejecutan 7 copias para la primera iteración

Etcétera. Después de la primera iteración con% 8 copias, exactamente 8 copias ocurren por iteración.

Al desenrollar el bucle de esta manera, la tara del bucle se reduce significativamente. Es importante tener en cuenta el orden de los valores de caso (0,7,6,5,4,3,2,1) que se prestan a ser traducidos a una tabla de salto por el comstackdor.

actualizar

Un problema con el código de ejemplo publicado por OP es que un valor de recuento de 0 provocará que se realicen 8 copias, lo que podría ocasionar un desbordamiento del búfer.

Dispositivo de Duff

En ciencias de la computación , el dispositivo de Duff es una implementación optimizada de una copia en serie que utiliza una técnica ampliamente aplicada en el lenguaje ensamblador para el desenrollado del lazo . Su descubrimiento se le atribuye a Tom Duff en noviembre de 1983, que en ese momento estaba trabajando para Lucasfilm . Es quizás el uso más dramático del fracaso de la etiqueta del caso en el lenguaje de progtwigción C hasta la fecha. Duff no se atribuye el mérito de haber descubierto el concepto de desenrollado de lazo , solo esta expresión particular de él en C.

Leer sobre el dispositivo de Duff