`

今天长见识了

阅读更多
先是读《Programming in Lua》第9章讲coroutine,然后去google coroutine,找到Simon Tatham写的一篇coroutine in c,讲怎么在C语言中实现coroutine,文中先ugly地基于栈实现了一个:

java 代码
 
  1. int function(void) {  
  2. static int i, state = 0;  
  3. switch (state) {  
  4. case 0goto LABEL0;  
  5. case 1goto LABEL1;  
  6. }  
  7. LABEL0: /* start of function */  
  8. for (i = 0; i < 10; i++) {  
  9. state = 1/* so we will come back to LABEL1 */  
  10. return i;  
  11. LABEL1:; /* resume control straight after the return */  
  12. }  
  13. }  

这个方法简单,但是相当丑陋,你必须手工维护这些标签。然后提到了Duff's Device技巧:
cpp 代码
 
  1. switch (count % 8) {  
  2. case 0: do { *to = *from++;  
  3. case 7: *to = *from++;  
  4. case 6: *to = *from++;  
  5. case 5: *to = *from++;  
  6. case 4: *to = *from++;  
  7. case 3: *to = *from++;  
  8. case 2: *to = *from++;  
  9. case 1: *to = *from++;  
  10. while ((count -= 8) > 0);  
  11. }  

这段代码能编译通过吗?能的,不信你试试,这是一段用于拷贝数组的代码,我们一般拷贝数组是这样做的:
cpp 代码
 
  1. send(to, from, count)  
  2. register short *to, *from;  
  3. register count;  
  4. {  
  5. do  
  6. *to = *from++;  
  7. while(--count>0);  
  8. }  

如果循环的中的操作足够快,那么其实大部分时间都是浪费在判断循环条件上面的,而通过Duff's Device通过switch语句将要进行的连续循环操作的次数进行了预判(根据擦case语句的位置)然后依次执行,而不必每次都去进 行测试条件,从而加速循环。这个技巧怎么应用于实现更优雅的coroutine呢?看代码
cpp 代码
 
  1. int function(void) {  
  2. static int i, state = 0;  
  3. switch (state) {  
  4. case 0: /* start of function */  
  5. for (i = 0; i < 10; i++) {  
  6. state = 1; /* so we will come back to "case 1" */  
  7. return i;  
  8. case 1:; /* resume control straight after the return */  
  9. }  
  10. }  
  11. }  

更好的方式是使用宏:
cpp 代码
 
  1. #define crBegin static int state=0; switch(state) { case 0:  
  2. #define crReturn(i,x) do { state=i; return x; case i:; } while (0)  
  3. #define crFinish }  
  4. int function(void) {  
  5. static int i;  
  6. crBegin;  
  7. for (i = 0; i < 10; i++)  
  8. crReturn(1, i);  
  9. crFinish;  
  10. }  

分享到:
评论
1 楼 mryufeng 2007-12-04  
看下glibc-2.5的实现 你会更体会什么叫开眼界。

相关推荐

    小学学校红领巾广播站广播稿之4.doc

    今天是我们在红领巾广播站与大家见面的日子。在这个美好的时刻,我们一起走进红领巾的世界,感受那份属于少先队员的荣耀与责任。 首先,让我们随着《少年先锋队队歌》的旋律,共同回想起入队仪式上的庄严承诺。随着...

    学生会文艺部部长竞选演讲稿范文(WORD可编辑)..docx

    今天,我站在这里,带着对文艺工作的热爱与激情,怀着一颗服务大家的热忱之心,参与学生会文艺部部长的竞选。在此,我将分享我的理念、计划以及对这个职位的理解和承诺。 首先,让我们共同思考一个问题:为什么我们...

    读书好书国旗下讲话稿参考.pdf

    例如,匡衡凿壁偷光、朱元璋不耻下问、万斯同博览群书、屈原吸收百家之长,这些故事都向我们展示了古人对知识的渴望和阅读带来的成就。通过他们的故事,我们应当被深深激励,要在现代生活中寻找属于自己的读书典范。...

    jQuery实现ajax的嵌套请求案例分析

    今天看到了一个嵌套的ajax,算是长见识了。 不过看一眼就知道怎么回事了。 不是不会,就怕想不到。 //发送一个ajax请求,嵌套的ajax请求 'ajaxCall': function(url1, data1, url2, data2){ var returnValue = ''; ...

    暑期社会实践报告-小镇实践.doc

    这让我们深刻意识到,关爱老年人是社会的责任,每个人都将面临老年,今天的他们就是明天的我们。 随后,我们的团队深入到企业中,体验劳动者的艰辛。在企业中,我们观察到工人们的辛勤工作,并了解到许多农村劳动力...

    亲子读书会主持词.docx

    这类书籍是孩子们探索世界、增长见识的宝库。它们不仅能够丰富孩子们的想象力,还能激发他们的好奇心和求知欲,让他们在轻松愉快的氛围中学习到科学知识。 历史故事的阅读也是我们不可忽视的部分。通过历史,我们...

    小学第一学期开学典礼讲话稿.doc

    - 学会阅读,因为阅读是打开知识宝库的钥匙,通过阅读,我们可以增长见识,提升理解和思考能力。 - 学会写字,书写不单是一种基本技能,更是表现个性和审美的一种方式,希望大家通过勤奋练习,做到既工整又美观。 - ...

    人教二年级语文上册农业的变化真大PPT学习教案.pptx

    特别是对于二年级的学生而言,了解农业从传统到现代的变迁,不仅是增长见识,更是激发他们对科学兴趣的重要途径。今天,我们就通过人教二年级语文上册中“农业的变化真大”这一课,来探索农业科技的进步,感受科技的...

    小学美术一年级下册船PPT学习教案.pptx

    今天,我们就以“小学美术一年级下册船PPT学习教案”为例,探讨如何设计一堂生动活泼的美术课,将历史、科技和艺术融为一体,让学生在乐趣中学习和成长。 教案的开篇是一个有趣的猜谜游戏,旨在引导孩子们思考中国...

    大学生竞选班级学习委员演讲稿_1.pdf

    同时,我还会不定期策划一些轻松的课外活动,如学术沙龙或小型聚会,让大家在紧张的学习之余得以放松,开阔视野,增长见识,同时也增强班级的凝聚力和集体荣誉感。 面对强大的竞争对手,我深知这不是一场轻松的比赛...

    小学语文自己花是让别人看PPT教案.pptx

    在全球化日益加深的今天,教育不再局限于本土文化的传承,更肩负着引导学生了解和尊重世界各地文化的重任。针对小学语文课程,"自己花是让别人看"这一主题的PPT教案,便是一种创新的教学实践,旨在通过丰富的图文...

    校园小报,手抄报,电子小报,读书小报:传染病1.pdf

    今天,我们要探讨的就是一份关于冬季传染病的教育资源——“传染病1.pdf”。 这份小报可能以手抄报的形式呈现,其目的在于让学生在制作的过程中,既能够了解传染病的相关知识,又能在实践中锻炼自己的信息整理和...

    暑期大学生实践报告精萃篇范本

    这个观点是技术创新中的重要指导原则,也是在技术飞速发展的今天值得所有人深思的问题。 在思考中国传统文化变化的问题上,报告通过分析春节燃放鞭炮的减少这一现象,探讨了中国传统文化的变迁。从历史角度看,春节...

    一年级语文下册 第4单元 17《小蝌蚪找妈妈》课件2 语文S版.ppt

    今天,我们将要探讨的是人教版一年级语文下册第四单元中的第17课——《小蝌蚪找妈妈》。这堂课不仅仅是文字的阅读,更是一次生动的自然科普,一次对生命成长历程的启迪。 《小蝌蚪找妈妈》这个故事围绕着一群活泼...

    世界读书日国旗下讲话.doc

    通过阅读,我们可以与古今中外的智者对话,增长见识,丰富内心,使自己变得更加睿智和高尚。让我们一起行动起来,让每一天都充满阅读的乐趣,让阅读成为我们生活中不可或缺的一部分。 让我们共同承诺,无论是现在...

    小学生7月份国旗下讲话.docx

    今天,我们在这里举行庄严的升国旗仪式,同时,我有幸在此发表7月份的国旗下讲话。在这个阳光明媚的日子里,我想和大家聊聊如何在暑假期间安排我们的活动,让我们的假期生活变得更加有意义和充实。 首先,我要提醒...

    初中语文语文百科植物植物界的最大家族

    在初中语文的学习中,我们不仅要掌握语言文字的运用,还应拓宽视野,学习各个领域的...在初中的语文学习中,结合生物学知识,不仅能够让我们增长见识,更能够培养我们的跨学科学习能力,为未来的成长奠定坚实的基础。

    航海专业学生就业现状与前景展望概论.pptx

    在国际竞争日益激烈的今天,航海专业学生应有更全面的准备,不仅要掌握扎实的专业知识,还要具备良好的外语能力、人际沟通能力,以及适应快速变化的海运市场的创新能力。只有这样,航海专业的毕业生们才能在未来的...

    论开卷有没有益作文.doc

    在今天这个信息爆炸的时代,书籍作为知识传播的重要载体,其作用和影响是无法估量的。然而,在讨论“开卷有没有益”这一话题时,我们不难发现,虽然读书本应是一个增长见识、提升修养的过程,但其结果并非总是正面的...

Global site tag (gtag.js) - Google Analytics