达夫设备

反直觉C++🔥, 👏欢迎github star

达夫设备

#include <iostream>

void fun(int i) {
    switch (i) {
        case 0:
            for(; i <= 2; ++i) {
                std::cout << "world, ";
        case 2:
                std::cout << "bye.\n";
                return;
        case 1:
                std::cout << "hello ";
            }
    }
}

int main() {
    int i = 0;
    fun(i);
    
    i = 1;
    fun(i);
    
    i = 2;
    fun(i);
    
    i = 3;
    fun(i);

    return 0;
}

输出

world, bye.
hello, world, bye.
bye.

switch-case语法应该是C语言中的基础,goto语法也是C语言中的基础。goto后面衔接的是label,而switch中的case也是一种label,这意味着case语句可以插入其他语句中,如for循环,这就如同电路板中的飞线,有点反直觉。

飞线

奇怪的知识增加了

i=0时,满足case 0,然后进入for循环,0 < 2成立,输出world,,在for循环中case 2:如同标号,被忽略,进而输出bye.return退出。

i=1时,满足case 1,输出hello,同时也经过飞线,直接跳进了for循环中,1 < 2成立,++ii=2,输出world,case 2:如同标号,被忽略,进而输出bye.return退出。

i=2时,满足case 2,输出bye.return退出。

i=3时,不满足任何case

这种反常的特性有一个著名的应用就是达夫设备(Duff’s device),主要用于循环展开以优化性能。

#include <iostream>
// 使用 case 来完成 duff's device
void private_memcpy(char *to, const char *from, size_t count) {
    size_t n = (count + 7) / 8;
    #define COPY *to = *from;
    #define ADVANCE to++, from++;
    switch (count % 8) {
    case 0: do { COPY ADVANCE
    case 7:      COPY ADVANCE
    case 6:      COPY ADVANCE
    case 5:      COPY ADVANCE
    case 4:      COPY ADVANCE
    case 3:      COPY ADVANCE
    case 2:      COPY ADVANCE
    case 1:      COPY ADVANCE
            } while (--n > 0);
    }
    #undef COPY
    #undef ADVANCE
}

int main() {
    const char from[] = "jintianxiaomidaobilema";
    char to[sizeof from];
    private_memcpy(to, from, sizeof from);
    std::cout << to << std::endl;
    return 0;
}

Asio的无栈协程也是基于飞线实现的。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 练习23:认识达夫设备 原文:Exercise 23: Meet Duff's Device 译者:飞龙 这个练习...
    布客飞龙阅读 609评论 1 35
  • 设计 设计是否经过多次迭代,并最终决定了最好的一个?是否同时使用自上而下和自下而上的方法来解决设计问题?类与类之间...
    愉快先生阅读 336评论 0 0
  • 设计设计是否经过多次迭代,并最终决定了最好的一个?是否同时使用自上而下和自下而上的方法来解决设计问题?类与类之间的...
    NoSurprise阅读 1,309评论 0 1
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,560评论 1 19
  • 1.概述 脚本语言的应用还是很多的,从系统管理、数据管理、程序开发等。那什么是批处理文件呢? 扩展名是bat(在n...
    八神庵2020阅读 1,351评论 0 2

友情链接更多精彩内容