简介

李明老师的C语言中级课程中,讲解了这一算法,无奈记性不好。。为了以后能时常看到,现记录下来。 函数原型为:

strcpy( char *dest, char *src )

简单方法

核心代码:

while( *dest++ = *src++ );

增量值算法

因为dest和src存储位置相邻,与其每次访问dest和src两个地址,不如只访问src所指存储空间,核心代码如下:

int delta = dest - src;
while(*(char *)(src + delta)++ = *src++);

每次复制4个字节算法

因为在32操作系统下,每次复制32位字符串,会大大地提高效率。核心代码如下:

int * d = (int *)dest;
int * s = (int *)src;
while(1) {
    if(!CONTAIN_OF_ZERO_BYTE(*s)) {
        * d = * s;
        d++, s++;
        continue;
    }
    src  = s;
    dest = d;
    while( *dest++ = *src++ );   //最多执行4次
}

上述的那个宏很重要,可以判断一个字节中是否含有‘\0’,因为字符串复制遇到’\0’就可以结束了。

#define TEST(n) (((n - 1) & (~n)) & 0x80)  // 为0时返回真
#define CONTAIN_OF_ZERO_BYTE(n) (((n - 0x01010101) & (~n))  & 0x80808080)  //只要字节中含有0即返回真

纸上得来终觉浅,绝知此事要躬行~