【问题标题】:Is Duff's device still useful?达夫的设备还有用吗?
【发布时间】:2026-01-24 21:15:01
【问题描述】:

我看到 Duff 的设备只是在 C 中进行循环展开。

https://en.wikipedia.org/wiki/Duff%27s_device

我不知道为什么它现在仍然有用。编译器不应该足够聪明来进行循环展开吗?

【问题讨论】:

    标签: gcc clang compiler-optimization loop-unrolling duffs-device


    【解决方案1】:

    编译器擅长循环展开,但有时当编译器无法证明它是正确的时,可能会抑制“明显”的优化。在 Duff 的设备案例中,目标是内存映射寄存器,源是任意指针。今天,内存映射寄存器可能必须标记为volatile,并且尚不清楚编译器是否可以确定源指针和目标指针是否可以别名。其中任何一个都可能会抑制优化。

    像 memcpy(与 Duff 的设备相似但不同)之类的东西通常是编译器已知的“特殊”函数,可能内置了多个手动优化的变体。期望编译器从“第一原则”生成 memcpy 可能不会像您期望的那样产生高度优化的版本。

    Duff 的设备不仅仅是循环展开,而是如何在没有额外循环的情况下处理多余的副本。这节省了代码空间,现在这可能不是一个问题。循环展开时编译器是否做同样的事情——我不知道。

    有用吗?可能,在某些极少数情况下。当达夫的设备最初被发明时,这可以说是正确的。

    【讨论】:

    • Duff 的设备完全没有必要 - 直到你遇到编译器产生一些绝对垃圾代码的边缘情况,并且你迫切希望从 opt-repeated 循环中减少微秒你的老板在尖叫,投资者在保释,你正在扯掉你的头发(他们俩!),然后你想起了达夫的装置,笑容慢慢地在你的脸上蔓延,因为……是的。你不必每天都需要它。你不需要每个月。您不需要每年甚至每十年都需要它 - 但是当您这样做时,很高兴知道您的工具箱中有它。对于那些天...