send(short* to, short* from, int count) { #if 0 // Originale Kopierschleife: Kopiere count Bytes von from nach to. while (count != 0) { *to = *from; ++to; ++from; --count; } #elif 0 // Reduziere count auf nächstkleineres Vielfaches von 8. while (count % 8 != 0) { *to = *from; ++to; ++from; --count; } /* 8-fach abgerollt, aber funktioniert nur wenn count % 8 == 0, daher die * vorangehende Schleife. */ while (count != 0) { *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; count -= 8; } #else /* Duff's Device: * Vorschleife und Hauptschleife sind verschränkt. * Vorschleife: Die switch-Anweisung springt abhängig von count % 8 zu dem * Fall, der entsprechend viele Kopien vornimmt (Durchfallen zum nächsten * Fall!). * Hauptschleife ist die do-while-Schleife, die case-Marken werden einfach * ignoriert. */ 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); } #endif }