<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    今天長見識了

    Posted on 2007-11-29 18:17 dennis 閱讀(1178) 評論(0)  編輯  收藏 所屬分類: linux & C
        先是讀《Programming in Lua》第9章講coroutine,然后去google coroutine,找到Simon Tatham寫的一篇coroutine in c,講怎么在C語言中實現coroutine,文中先ugly地基于棧實現了一個:
    int function(void) {
        
    static int i, state = 0;
        
    switch (state) {
            
    case 0goto LABEL0;
            
    case 1goto LABEL1;
        }
        LABEL0: 
    /* start of function */
        
    for (i = 0; i < 10; i++) {
            state 
    = 1/* so we will come back to LABEL1 */
            
    return i;
            LABEL1:; 
    /* resume control straight after the return */
        }
    }

    這個方法簡單,但是相當丑陋,你必須手工維護這些標簽。然后提到了Duff's Device技巧:
    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);
        }

    這段代碼能編譯通過嗎?能的,不信你試試,這是一段用于拷貝數組的代碼,我們一般拷貝數組是這樣做的:
    send(to, from, count)
            register 
    short *to, *from;
            register count;
            {
                    
    do
                            
    *to = *from++;
                    
    while(--count>0);
            }
    如果循環的中的操作足夠快,那么其實大部分時間都是浪費在判斷循環條件上面的,而通過Duff's Device通過switch語句將要進行的連續循環操作的次數進行了預判(根據擦case語句的位置)然后依次執行,而不必每次都去進 行測試條件,從而加速循環。這個技巧怎么應用于實現更優雅的coroutine呢?看代碼

    int function(void) {
        
    static int i, state = 0;
        
    switch (state) {
            
    case 0/* start of function */
            
    for (i = 0; i < 10; i++) {
                state 
    = 1/* so we will come back to "case 1" */
                
    return i;
                
    case 1:; /* resume control straight after the return */
            }
        }
    }
    更好的方式是使用宏:
    #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;
    }



    主站蜘蛛池模板: 亚洲午夜福利精品无码| 免费看大美女大黄大色| 亚洲av伊人久久综合密臀性色| 美女视频黄频a免费观看| 国产中文字幕免费| 最新亚洲人成网站在线观看| 免费一看一级毛片| 一级做a爱过程免费视频高清| 国产av无码专区亚洲国产精品| 一个人看的免费视频www在线高清动漫 | 国产精品亚洲色婷婷99久久精品| 成人免费无码精品国产电影| 亚洲AV永久无码精品一福利| 免费观看国产精品| h视频在线免费观看| 久久伊人久久亚洲综合| 99久久国产免费中文无字幕| 亚洲专区一路线二| 成在线人永久免费视频播放| 国产大片免费天天看| 亚洲视频中文字幕| 成人免费无码大片a毛片| 色噜噜的亚洲男人的天堂| 国产成人精品日本亚洲专区| 久别的草原电视剧免费观看| 亚洲乱码一二三四区麻豆| 日本免费人成视频播放| 成人妇女免费播放久久久| 久久亚洲AV成人出白浆无码国产| a级毛片无码免费真人| 乱人伦中文视频在线观看免费| 国产AV无码专区亚洲Av| 免费无码黄十八禁网站在线观看| 国产成人 亚洲欧洲| 婷婷久久久亚洲欧洲日产国码AV | a国产成人免费视频| 亚洲av无码不卡久久| 亚洲视频在线一区二区| 在线人成精品免费视频| 添bbb免费观看高清视频| 亚洲Aⅴ无码专区在线观看q|