void* mymemcpy( void* dest, const void* src, size_t count )

void* mymemcpy( void* dest, const void* src, size_t count )
{
        assert(dest!=NULL);
        assert(src!=NULL);
        char* pdest=(char*)dest;
        char* psrc=(char*)src;
        if(psrc<pdest&&psrc+count>pdest)
        {
                psrc=psrc+count-1;
                pdest=pdest+count-1;
                while(count-->0)
                        *pdest--=*psrc--;
         }
         else
         {
                while(count-->0)
                       *pdest++=*psrc++;
          }
          return dest;
}

注意防止地址有重疊部分,還有指針類型轉換,這是常規實現方法;

void* mymemcpy( void* dest, const void* src, size_t count )  

{                                                                                  

    char* d = (char*)dest;                                                 

    const char* s = (const char*)src ;                                 

    int n = (count + 7) / 8; // count > 0 assumed                   

    switch( count & 7 )                                                      

    {                                                                              

    case 0:  do {  *d++ = *s++;                                         

    case 7:        *d++ = *s++;                                           

    case 6:        *d++ = *s++;                                           

    case 5:        *d++ = *s++;                                           

    case 4:        *d++ = *s++;                                           

    case 3:        *d++ = *s++;                                           

    case 2:        *d++ = *s++;                                           

    case 1:        *d++ = *s++;                                           

               } while (--n > 0);                                             

    }                                                                              

    return dest;                                                                

}       

這程序寫的太變態了,乍一看,不知所云,細看一下,琢磨一下還可以:

摘自原貼:

int n = (count + 7) / 8;計算要複製的輪數(每輪複製8位),剩下的餘數位數也要複製進去。
count & 7控制要複製餘數位數,while (--n > 0)控制輪數。
比如count = 9,則n = 2,count & 7 = 1,要複製2輪,程序跳到case1執行,複製一位之後,再循環一輪,複製8位.

爲何這麼實現:引用上面帖子後面的評論:

每8個字節拷貝省7個跳轉(AMD處理器內部分支預測算法是“假定全都跳轉”,因此這裏也就是相當於省了7個時鐘週期);把swith和do循環湊到一起,多少省幾個字節的空間…… 
但使用32位或64位指令,可以得到更大的優化效果,代碼還要精煉得多。 
說實在話:除非內存小到極點、並且無法增加的系統,寫出這樣的程序純屬作孽……



發佈了5 篇原創文章 · 獲贊 2 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章