Что такое Duff's device и зачем он нужен?
Что такое Duff's device и зачем он нужен?
Видел такой код на википедии, но так и не понял, в чём смысл. Объясните, пожалуйста.
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7) / 8; // gives the number of iterations
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);
}
}
Ответы (1 шт):
Из Википедии:
Это оптимизированная реализация последовательного копирования, использующая ту же технику, что применяется для размотки циклов.
Традиционный способ последовательного копирования (до открытия Даффа) выглядел так:
do { /* Предполагается count > 0 */ *to = *from++; /* Здесь указатель to не увеличивается */ } while (--count > 0);В этом примере to не увеличивается потому, что Дафф копировал в единственный регистр ввода-вывода, отображаемый в память. В современном языке Си определение переменной to должно быть подкреплено с помощью ключевого слова volatile.
Во время оптимизации этого кода Дафф осознал, что «раскрученный» вариант цикла может быть реализован при помощи наложения конструкций switch и do/while.
strcpy(to, from, count) register char *to, *from; register count; { register n = (count + 7) / 8; if (!count) return; 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); } }