5

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

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

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

4

1 回答 1

6

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

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

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

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

于 2019-02-08T18:31:05.080 回答