天天看點

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.相對更容易記憶

繼續閱讀