很多年前,在处理严格的图形I/O问题时,Tom Duff展开了一个循环并创建了他的Duff设备,如下所示:
dsend(to, from, count)
char *to, *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);
}
}
Run Code Online (Sandbox Code Playgroud)
(注意这使用旧式函数参数 - 这不是错误.)
这种编码直接来自于汇编程序和C编码的思考,并且依赖于C的case语句落实.隔行扫描控制结构中的这种创造力能否适用于任何其他语言?
它适用于 C++。
请注意,生成的代码取决于您的编译器。特别是,当我使用面向 ARM 架构的 GCC 编译 Duff 的设备时,生成的 ARM 汇编器在任何优化级别上都是次优的(我认为 GCC 将其变成了跳转表)。
我最终只是处理汇编程序的编码。