高效的strcpy函数

来源:互联网 发布:2016詹姆斯数据统计 编辑:程序博客网 时间:2024/06/05 06:34

印象中,我毕业第一次面试写的strcpy函数是用数组实现的。

(准确来说,那甚至不能算是一个strcpy函数,因为我只是在main函数里面,用for循环把一个字符串传到另外一个字符串,年少无知啊)


然后第二次面试的时候,算是写了一个能算得上是函数的版本,大概是这样子。

char *strcpy_v2(char *dest , const char *src){    char *d = dest;    char c;     while((c=*src++) != '\0')    {        *(dest++)=c;    }      *dest='\0';      return d;}


后来接触到某个优化的版本是,也目前网上比较容易见到

char * strcpy (char * dst, const char * src)  {      char * cp = dst;        while( *cp++ = *src++ )              ;               /* Copy src over dst */      return( dst );  }  


上面这个函数的缺点我也不多说了,我希望不会有人模仿。


下面贴一下glibc的strcpy实现。

(需要注意的是,glibc会针对不同的cpu作优化,也就是说不同的平台可能会有不同的实现版本,具体的请看 GFreeWind的博客)

char * strcpy (char *dest, const char *src) {<span style="white-space:pre"></span>reg_char c;<span style="white-space:pre"></span>char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);<span style="white-space:pre"></span>const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;<span style="white-space:pre"></span>size_t n;<span style="white-space:pre"></span>do { <span style="white-space:pre"></span>c = *s++;<span style="white-space:pre"></span>s[off] = c;<span style="white-space:pre"></span>} while (c != '/0');<span style="white-space:pre"></span>n = s - src;<span style="white-space:pre"></span>(void) CHECK_BOUNDS_HIGH (src + n);<span style="white-space:pre"></span>(void) CHECK_BOUNDS_HIGH (dest + n);<span style="white-space:pre"></span>return dest;}
</pre><pre name="code" class="cpp">
其中,<pre name="code" class="cpp"><span></span>(void) CHECK_BOUNDS_HIGH (src + n);<span></span>(void) CHECK_BOUNDS_HIGH (dest + n);

这两行涉及到某些宏,具体的分析可以参考
《glibc--strcpy源码分析》


实际上,不同版本的函数库里面,strcpy函数实现差异挺大的。

而且为了提高性能,都做了很多特殊的优化,可读性比较差。有兴趣的可以比较一下。




    IT从业人员需要及时关注技术动态,但是互联网的内容却过于离散,好东西往往隐藏得很深。现在可以在微信公众号里面
    搜索关注“小鱼儿的IT技术分享”,订阅我为大家每天汇总的IT技术信息。欢迎大家关注!
      有兴趣的请点击《与IT技术相关的微信公众号》


0 0