strlen實現的對比學習

參考ucos2的string.c、uboot(kernel)的string.c.
選擇最簡單的函數strlen作爲分析,實踐對比學習的方法,產生更多的思考。

str_len

原理也比較簡單:字符串的結束標誌爲’\0’。所以測試一個字符串的長度,就是循環讀到’\0’.計算讀了多少個字符,最後返回長度。

在ucos中的源碼:

CPU_SIZE_T Str_Len(CPU_CHAR *pstr)
{
    CPU_SIZE_T len;
    len = 0;
    while ((pstr !=(CPU_CHAR *)0) && (*pstr != (CPU_CHAR)0))
    {
        len++;
        pstr++;
    }
    
     return (len);
}

在uboot中的實現:

size_t strlen(const char *s)
{
    const char *sc;
    for (sc = s; *sc!='\0';++sc)
        /*nothing*/
    return sc-s;
}

一對比代碼,我們可以從中學習到很多東西:
ucos的代碼實現方式更像是我們一般的思路的實現方式。

我們要返回長度,那就定義一個長度的變量,我們要循環判斷是否到結尾,就用個while,然後++計數。

而uboot的實現方式,一個字妙:使用指針的方式循環遍歷,最後用地址相減得到長度。

細節:
1.傳入型參數const的標記
2.const char *sc;的細節,指向地址內容不能被修改
3.for (sc = s; *sc!=’\0’;++sc),一句話就完成了循環遍歷。
4.++sc的細節也是體現效率的地方
5.最後返回值只需要sc-s的地址相減的一次計算,相比len++提高效率。
6.野指針的處理,ucos2中有單獨的判斷,而在uboot中沒有。

對比代碼的學習好處:
1.能以兩種不同的方式看實現方式
2.能發現優劣
3.能容易的理解
4.當發現不同時,努力糾其根本,也是種樂趣
5.相對更容易記憶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章