先是读《Programming in Lua》第9章讲
coroutine,然后去google coroutine,找到Simon Tatham写的一篇coroutine in c,讲怎么在C语言中实现coroutine,文中先ugly地基于栈实现了一个:
java 代码
- int function(void) {
- static int i, state = 0;
- switch (state) {
- case 0: goto LABEL0;
- case 1: goto LABEL1;
- }
- LABEL0:
- for (i = 0; i < 10; i++) {
- state = 1;
- return i;
- LABEL1:;
- }
- }
这个方法简单,但是相当丑陋,你必须手工维护这些标签。然后提到了Duff's Device技巧:
cpp 代码
- 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 ((count -= 8) > 0);
- }
这段代码能编译通过吗?能的,不信你试试,这是一段用于拷贝数组的代码,我们一般拷贝数组是这样做的:
cpp 代码
- send(to, from, count)
- register short *to, *from;
- register count;
- {
- do
- *to = *from++;
- while(--count>0);
- }
如果循环的中的操作足够快,那么其实大部分时间都是浪费在判断循环条件上面的,而通过Duff's Device通过switch语句将要进行的连续循环操作的次数进行了预判(根据擦case语句的位置)然后依次执行,而不必每次都去进 行测试条件,从而加速循环。这个技巧怎么应用于实现更优雅的
coroutine呢?看代码
cpp 代码
- int function(void) {
- static int i, state = 0;
- switch (state) {
- case 0:
- for (i = 0; i < 10; i++) {
- state = 1;
- return i;
- case 1:;
- }
- }
- }
更好的方式是使用宏:
cpp 代码
- #define crBegin static int state=0; switch(state) { case 0:
- #define crReturn(i,x) do { state=i; return x; case i:; } while (0)
- #define crFinish }
- int function(void) {
- static int i;
- crBegin;
- for (i = 0; i < 10; i++)
- crReturn(1, i);
- crFinish;
- }
分享到:
相关推荐
今天是我们在红领巾广播站与大家见面的日子。在这个美好的时刻,我们一起走进红领巾的世界,感受那份属于少先队员的荣耀与责任。 首先,让我们随着《少年先锋队队歌》的旋律,共同回想起入队仪式上的庄严承诺。随着...
今天,我站在这里,带着对文艺工作的热爱与激情,怀着一颗服务大家的热忱之心,参与学生会文艺部部长的竞选。在此,我将分享我的理念、计划以及对这个职位的理解和承诺。 首先,让我们共同思考一个问题:为什么我们...
例如,匡衡凿壁偷光、朱元璋不耻下问、万斯同博览群书、屈原吸收百家之长,这些故事都向我们展示了古人对知识的渴望和阅读带来的成就。通过他们的故事,我们应当被深深激励,要在现代生活中寻找属于自己的读书典范。...
今天看到了一个嵌套的ajax,算是长见识了。 不过看一眼就知道怎么回事了。 不是不会,就怕想不到。 //发送一个ajax请求,嵌套的ajax请求 'ajaxCall': function(url1, data1, url2, data2){ var returnValue = ''; ...
这让我们深刻意识到,关爱老年人是社会的责任,每个人都将面临老年,今天的他们就是明天的我们。 随后,我们的团队深入到企业中,体验劳动者的艰辛。在企业中,我们观察到工人们的辛勤工作,并了解到许多农村劳动力...
这类书籍是孩子们探索世界、增长见识的宝库。它们不仅能够丰富孩子们的想象力,还能激发他们的好奇心和求知欲,让他们在轻松愉快的氛围中学习到科学知识。 历史故事的阅读也是我们不可忽视的部分。通过历史,我们...
- 学会阅读,因为阅读是打开知识宝库的钥匙,通过阅读,我们可以增长见识,提升理解和思考能力。 - 学会写字,书写不单是一种基本技能,更是表现个性和审美的一种方式,希望大家通过勤奋练习,做到既工整又美观。 - ...
特别是对于二年级的学生而言,了解农业从传统到现代的变迁,不仅是增长见识,更是激发他们对科学兴趣的重要途径。今天,我们就通过人教二年级语文上册中“农业的变化真大”这一课,来探索农业科技的进步,感受科技的...
今天,我们就以“小学美术一年级下册船PPT学习教案”为例,探讨如何设计一堂生动活泼的美术课,将历史、科技和艺术融为一体,让学生在乐趣中学习和成长。 教案的开篇是一个有趣的猜谜游戏,旨在引导孩子们思考中国...
同时,我还会不定期策划一些轻松的课外活动,如学术沙龙或小型聚会,让大家在紧张的学习之余得以放松,开阔视野,增长见识,同时也增强班级的凝聚力和集体荣誉感。 面对强大的竞争对手,我深知这不是一场轻松的比赛...
在全球化日益加深的今天,教育不再局限于本土文化的传承,更肩负着引导学生了解和尊重世界各地文化的重任。针对小学语文课程,"自己花是让别人看"这一主题的PPT教案,便是一种创新的教学实践,旨在通过丰富的图文...
今天,我们要探讨的就是一份关于冬季传染病的教育资源——“传染病1.pdf”。 这份小报可能以手抄报的形式呈现,其目的在于让学生在制作的过程中,既能够了解传染病的相关知识,又能在实践中锻炼自己的信息整理和...
这个观点是技术创新中的重要指导原则,也是在技术飞速发展的今天值得所有人深思的问题。 在思考中国传统文化变化的问题上,报告通过分析春节燃放鞭炮的减少这一现象,探讨了中国传统文化的变迁。从历史角度看,春节...
今天,我们将要探讨的是人教版一年级语文下册第四单元中的第17课——《小蝌蚪找妈妈》。这堂课不仅仅是文字的阅读,更是一次生动的自然科普,一次对生命成长历程的启迪。 《小蝌蚪找妈妈》这个故事围绕着一群活泼...
通过阅读,我们可以与古今中外的智者对话,增长见识,丰富内心,使自己变得更加睿智和高尚。让我们一起行动起来,让每一天都充满阅读的乐趣,让阅读成为我们生活中不可或缺的一部分。 让我们共同承诺,无论是现在...
今天,我们在这里举行庄严的升国旗仪式,同时,我有幸在此发表7月份的国旗下讲话。在这个阳光明媚的日子里,我想和大家聊聊如何在暑假期间安排我们的活动,让我们的假期生活变得更加有意义和充实。 首先,我要提醒...
在初中语文的学习中,我们不仅要掌握语言文字的运用,还应拓宽视野,学习各个领域的...在初中的语文学习中,结合生物学知识,不仅能够让我们增长见识,更能够培养我们的跨学科学习能力,为未来的成长奠定坚实的基础。
在国际竞争日益激烈的今天,航海专业学生应有更全面的准备,不仅要掌握扎实的专业知识,还要具备良好的外语能力、人际沟通能力,以及适应快速变化的海运市场的创新能力。只有这样,航海专业的毕业生们才能在未来的...
在今天这个信息爆炸的时代,书籍作为知识传播的重要载体,其作用和影响是无法估量的。然而,在讨论“开卷有没有益”这一话题时,我们不难发现,虽然读书本应是一个增长见识、提升修养的过程,但其结果并非总是正面的...