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