c / expert
Snippet
Duffs Gerät zur manuellen Schleifenentrollung
Duffs Gerät ist ein berühmtes C-Idiom, das Schleifenentrollung implementiert, indem eine Switch-Anweisung mit einer Do-While-Schleife verwebt wird. Dies ermöglicht es dem Programm, in die Mitte der Schleife zu springen, um den Rest der Elemente zu verarbeiten, wenn die Gesamtzahl kein Vielfaches des Entrollungsfaktors (hier 8) ist. Es minimiert die Anzahl der Sprungbefehle und den Schleifen-Overhead.
snippet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void dcopy(short *to, short *from, 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);}}
Erklärung
1
int n = (count + 7) / 8;
Berechnet die Gesamtzahl der Iterationen, die für die entrollten Blöcke erforderlich sind.
2
switch (count % 8) {
Bestimmt den Einstiegspunkt in die Schleife basierend auf dem Restwert.
3
case 0: do { *to = *from++;
Der Schleifenbeginn; Case 0 behandelt Zählstände, die exakte Vielfache von 8 sind.
4
} while (--n > 0);
Dekrementiert den Blockzähler und wiederholt den entrollten 8-Schritt-Prozess.