c / expert
Snippet
Manuelles Entrollen von Schleifen mit Duffs Device
Duff's Device ist eine berühmte Technik, die eine nach C-Standard valide Verschachtelung einer `switch`-Anweisung mit einer `do-while`-Schleife nutzt. Sie erzielt ein manuelles Schleifen-Unrolling mit minimalem Overhead für Zweigbedingungs-Prüfungen. Die `switch`-Anweisung springt direkt in die Mitte des entrollten Blocks, um verbleibende Elemente abzuarbeiten, woraufhin die Schleifenausführung nahtlos fortgesetzt wird.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>#include <stddef.h>void duff_copy(char *to, const char *from, size_t count) {if (count == 0) return;size_t 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);}}int main(void) {const char src[] = "DuffsDeviceUnrollingTest";char dest[30] = {0};duff_copy(dest, src, sizeof(src));printf("Copied string: %s\n", dest);return 0;}
Erklärung
1
size_t n = (count + 7) / 8;
Berechnet die Gesamtzahl der entrollten Schleifendurchläufe für 8-er Blöcke.
2
switch (count % 8) {
Springt zur exakten Fall-Through-Case-Markierung für verbleibende Elemente vor Beginn vollständiger Schleifendurchläufe.
3
case 0: do { *to++ = *from++;
Verschachtelt die do-while-Schleifengrenze mit dem Switch-Label 0 für die zyklische Ausführung.