0. 前言
以下介绍的两个大牛都是利用了 switch 语句中的 case 部分可以置于一个block (通常是 if{} 或 while{} 块)中, switch 语句执行一个直接跳转进入该block,进入该 block 的条件有时候被有意地忽略。
全文思路和代码绝无原创之处,只是略加整理了一下。更详细的请看提供的链接。希望高手老鸟们指出错误不足并给出更深入的分析,如果能提出比例子更漂亮的方案 就太棒了(我感觉可以用回调函数一类的方法实现协作过程,不过还没细想)。
代码规范的讨论就请免了,Simon Taham 在文章里说了一段话挺有趣:
Any coding standard which insists on syntactic clarity at the expense
of algorithmic clarity should be rewritten. If your employer fires you
for using this trick, tell them that repeatedly as the security staff
drag you out of the building. hahaha
1. Duff's device (原创 Tom Duff)
http://en.wikipedia.org/wiki/Duff%27s_device
下面一段小程序:
这段程序最让大牛们不爽的是,每拷贝一个字节就需要完成和拷贝字节同量级甚至更耗时的减法及比较操作,一个可能的优化是减少循环次数,即在一次减法和比较之后批处理拷贝几个字节,可能的代码如下:
注: 例子其实是 Stroustrup 的新手友好版本而不是 Tom 大叔的原始版本,但
是非常接近。这个版本可以再精简一点点,抛弃变量 n,将 while(--n > 0) 改
为
- while ((count -= 8) > 0)
2.1 引子
考虑如下函数:
![](https://i-blog.csdnimg.cn/blog_migrate/44338250f0a06e170ca17324f1e5bf09.gif)
2.2 协作过程
在编写 putty 的过程中,这个大牛发明了上述用法来解决所谓协作过程的问题。考虑以下两个例程:
向大牛们致敬,他们的奇思妙想给我们带来了无尽的乐趣,引用一句俗得不能再俗的话和各位同好共勉:have a lot of fun
![](https://i-blog.csdnimg.cn/blog_migrate/44338250f0a06e170ca17324f1e5bf09.gif)
题外话,这个版事实上大多在讨论和 C/C++ 本身无关的话题,诸如网络编程,系统编程,多线程多进程一类的其实都和 C/C++ 没什么关系。是不是可以考虑增加系统编程子版面,有关系统调用,同步,socket 编程的都丢过去。另外,orz,真不好意思,前两天我自己就把一个 Makefile 相关的东东丟在这个版里而不是它本来应该在的shell版。