`

今天长见识了

阅读更多
先是读《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的实现 你会更体会什么叫开眼界。

相关推荐

    红领巾广播站广播稿九月.doc

    “历史的今天”栏目虽然未在内容中具体展开,但通常会介绍历史上这一天发生的重大事件,帮助学生了解历史,增长见识。 最后的“心语音乐盒”栏目回应了一位名叫小米的六年级学生的困扰,关于如何处理异性同学表达...

    2021-2022年收藏的精品资料专题12 补全对话及短文填空词或句子或语法填空第03期中考英语试题分项版解析汇编原卷版.doc

    美国摄影师Irving Penn在1947年的作品就证明了这一点,他的美食照片即使在今天看来仍然极具吸引力。社交媒体的兴起进一步促进了Foodtography的流行,因为明星或影响力人物发布一张诱人的食物图片,就能为餐厅带来...

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

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

    “世界阅读日”演讲参考演讲稿.doc

    它能陶冶情操,增长见识,锻炼思维,培养批判性思考的能力。同学们,你们是否已经为自己规划了阅读的路径,设立了阅读的目标呢?每天,无论多忙,都应该抽出时间,静下心来,享受阅读带来的乐趣。 “世界阅读日”...

    我的伯父鲁迅先生.ppt

    鲁迅认为阅读不仅是消遣,更是增长见识、塑造人格的过程。他鼓励孩子们阅读经典,通过讨论激发他们独立思考的能力。 其次,救助车夫的故事揭示了鲁迅对底层劳动人民的深切关怀。当看到车夫受伤,他毫不犹豫地提供...

    古代经典格言.docx

    " 鼓励人们平时多读书,积累知识,同时也要勇于实践,通过经历来增长见识。 8. "君子以见善那么迁,有过那么改。" 君子的行为准则是在认识到错误时勇于改正,见到好的行为则积极学习。 9. "十室之邑,必有忠信如丘...

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

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

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

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

    司马迁简介.doc

    司马迁生于西汉时期的夏阳,即今天的陕西韩城或山西河津,其家族有着深厚的史官传统。据《史记·太史公自序》记载,司马迁的祖先可追溯至颛顼时代的天官,家族中有在秦国担任重要军事职务的历史,如六世祖司马错在...

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

    作者呼吁社会给予老年人更多的关爱,因为每个人都将面临老年,今天的他们就是明天的我们。 接着,实践团队深入到企业中,体验劳动者的艰辛。他们观察到工人们的辛勤工作,了解到农村劳动力通过打工获得的收入远高于...

    个人信息技术应用成果宣贯.pdf

    在信息技术日益发达的今天,教育工作者需要不断提升自身的信息技术应用能力,以适应教育领域的新需求。个人信息技术应用成果主要体现在以下几个方面: 首先,积极参与校本研修活动是提升教师信息技术应用能力的重要...

    2021精品手抄报系列-读书小报 (25).docx

    在21世纪的今天,尽管科技日新月异,电子设备普及,但纸质书籍的魅力依然无法替代,它们仍然是获取知识、启迪思维的重要途径。 对于小学生来说,养成良好的阅读习惯至关重要。读书不仅可以增长见识,拓宽视野,还能...

    参加工商培训心得体会5篇.docx

    不同地区、不同岗位的学员在一起学习,可以互相借鉴,共同进步,不仅丰富了个人的见识,也为日后的工作合作打下了基础。 总之,工商培训对于工商管理人员来说是一次宝贵的提升机会,它帮助我们理解当前的形势,掌握...

    相关优选的图书节学员意味着发言稿范文4篇.pdf

    今天,我将分享一些关于读书与个人成长的观点。 首先,我们要认识到,书籍是人类智慧的结晶,是我们开拓视野、提升素养的宝贵资源。正如发言稿中提到的,书籍是攀登知识高峰的阶梯,是开启智慧大门的钥匙,也是引领...

    大一寒假实习报告.docx

    原本以为自己已经学会了一些基础的知识就够用了,可到了实习的时候才知道原来自己要学的东西还有很多,以后自己要走的路还很长,不能只安于现状,一定要奋勇直前。 在实践的这些日子里,我们穿街走户接触各种各样的...

    2013年中考英语汇编精讲41 应用作文

    - 增长见识:通过阅读,我们可以了解到不同的文化、历史和社会现象,从而开阔视野,提高理解力和分析能力。 - 提升幸福感:阅读可以带来精神上的愉悦,让人在知识的海洋中找到乐趣,使我们的生活更加丰富多彩。 2...

    镜花缘读书心得最新读后感.pdf

    同时,它对教育和文化交流的重视,也为今天的我们提供了借鉴,提醒我们保持开放心态,尊重并学习不同文化。 总的来说,《镜花缘》不仅仅是一部富有想象力的奇幻小说,更是一部充满智慧与深思的作品。它通过生动的...

    中同学《海底两万里》读书笔记优秀___.docx

    在书中,作者描绘了一个充满未知与奇观的海底世界,通过阿龙纳斯教授的视角,读者得以见识到丰富的海洋生物、独特的地理现象以及惊险的探险经历。例如,他们遭遇冰山封路,面对生存的挑战,必须共同努力破冰脱困;还...

    21___我最好的老师.ppt

    这篇PPT内容主要围绕一篇名为《21___我最好的老师》的文章展开,文章讲述了...这对于我们今天的教育同样具有启示意义,教育者应鼓励学生主动探索、独立思考,而学生也应该敢于挑战既有观念,以开放的心态去学习和成长。

Global site tag (gtag.js) - Google Analytics