我看到Duff的设备只是要在C中展开循环。
https://en.wikipedia.org/wiki/Duff%27s_device
我不确定为什么它现在仍然有用。编译器是否应该足够聪明以进行循环展开?
答案 0 :(得分:2)
编译器擅长循环展开,但是有时,当编译器无法证明其正确性时,“明显的”优化可能会受到抑制。在Duff设备的情况下,目标是内存映射寄存器,而源是任意指针。如今,内存映射寄存器可能必须标记为volatile
,并且尚不清楚编译器是否可以确定源指针和目标指针是否可以别名。这些都可能会抑制优化。
诸如memcpy之类的东西(与Duff的设备类似但不同)通常是编译器已知的“特殊”功能,这些功能可能内置了多个手动优化的变体。期望编译器根据“第一原理”生成memcpy无法产生您所期望的高度优化的版本。
Duff的设备不仅涉及循环展开,还涉及如何处理多余的副本而没有额外的循环。这样可以节省代码空间,现在可能不再是一个问题。循环展开时,编译器是否做同样的事情-我不知道。
有用吗?在某些罕见的情况下可能。当Duff的设备最初也被发明时,这可以说是真的。