天天看点

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.相对更容易记忆

继续阅读