Duff's device 是一种通过 switch 与 do-while 结合实现手动循环展开的 C/C++ 技巧,由 Tom Duff 于 1983 年提出,用于减少分支开销以高效复制内存;其核心是利用 case 贯穿和模运算跳转到展开体指定位置,再由 do-while 控制主循环次数,总执行次数精确为 count;虽在早期可显著提升性能,但现代编译器自动优化使其优势减弱,且降低可读性与可维护性,实际开发中更推荐使用标准库函数或依赖编译器自动展开。

Duff's device 是 C/C++ 中一种利用 switch 和 do-while 穿插跳转实现**手动循环展开(loop unrolling)** 的经典技巧,由 Tom Duff 在 1983 年提出,初衷是高效复制内存块(如向寄存器写入多个字节),在缺乏编译器自动展开支持的年代显著减少分支开销。
核心原理:用 switch 跳进 do-while 循环体
它绕过传统 for/while 的每次迭代判断,把循环次数模 N 的余数作为 switch 入口,直接跳到展开体的某个位置开始执行,再靠 do-while 自动“滚”完剩余迭代。最常见的是 8 路展开:
void duffs_device(char* to, char* 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);
}
}
登录后复制
关键点:
- case 标签不带 break,靠“贯穿(fall-through)”自然衔接下一条赋值
- switch 只执行一次,决定起始位置;do-while 控制主循环次数
- 总执行次数仍精确为 count,无重复或遗漏
为什么能提升性能?
在早期 CPU 和弱优化编译器下,它减少了:
立即学习“C++免费学习笔记(深入)”;
标签: c++ 循环展开 处理器 字节 switch 热点 性能瓶颈 作用域 代码可读性 标准库 为什么
还木有评论哦,快来抢沙发吧~