Duff的设备是否适用于其他语言?

Sha*_*son 7 c

很多年前,在处理严格的图形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语句落实.隔行扫描控制结构中的这种创造力能否适用于任何其他语言?

tpd*_*pdi 5

它适用于 C++。

请注意,生成的代码取决于您的编译器。特别是,当我使用面向 ARM 架构的 GCC 编译 Duff 的设备时,生成的 ARM 汇编器在任何优化级别上都是次优的(我认为 GCC 将其变成了跳转表)。

我最终只是处理汇编程序的编码。

  • 是的,当编译器没有进行太多优化时(这是 Duff 提出的),这很好。问题是在每一步都有直通流程和“案例”标签,需要一个非常好的编译器来解决它不需要刷新寄存器等。一个好的编译器可能是无论如何都能够展开幼稚实现的循环。不过,这是一个很好的面试问题:) (4认同)

Dav*_*ave 5

您可以使用任何支持计算GOTO语句的语言(Fortran,一些BASIC等)来完成它.