《高质量程序设计指南》--strcpy 的实现 c语言实现strcpy函数

strcpy 看似是标准函数库里面最简单的函数了,谁都可以实现这个函数,

但是,并不一定谁都能实现的很好。林锐博士面试微软的时候,就做这个题目。

他也没有把这个题目完全的做对。建议你自己先动手写一个自己的,不要先看

答案。估计有 90%的人写出来的,达不到性能的要求。

标准答案是这样的:

static char * strcpy(char *dest, const char *src)

{

assert(dest != NULL && src != NULL);

char *ret = dest;

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

return ret;

}

测试了一下,这个函数,在10亿数据规模的复制,在我电脑上大概是 140 ms (release)

下面的写法基本上可以判定是错误:

static char * strcpy(char *dest, const char *src)

{

assert(dest != NULL && src != NULL);

char *ret = dest;

while ((*dest = *src) != '')

{

dest++;

src++;

}

return ret;

}

可能你会很奇怪,为什么这个是错误的。这个写法大概损失 10%的性能,而且和编译器能优化

的程度有关。原因你看反汇编的代码就知道,指令增加了不少。因为,你要给出一个最优的结果。

但是,似乎还有提升的可能性, 在做这个题目的时候,我首先写出来的是:

static char * strcpy(char *dest, const char *src)

{

assert(dest != NULL && src != NULL);

int i = 0;

while (*src != '')

{

dest[i++] = *src++;

}

dest[i] = '';

return dest;

}

别看这算法简单,其实,和标准答案的速度完全一样。为什么,估计要看反汇编。

但是,我总是不相信会这样简单,后来所有题目做好了,还有好多时间,我就想这个算法

的优化,下面是我优化过的算法:

static char * strcpy(char *dest, const char *src)

{

assert(dest != NULL && src != NULL);

char *s = (char *)src;

《高质量程序设计指南》--strcpy 的实现 c语言实现strcpy函数
int delt = dest - src;

while ((s[delt] = *s++) != '');

return dest;

}

这个算法 很巧妙的回避了一个指针的累加,结果是 96ms 速度提升了近1倍

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/182539.html

更多阅读

《后宫甄嬛传》中出现过的所有诗词 后宫甄嬛传番外

《后宫甄嬛传》中出现过的所有诗词!女主名字的出处一:我低着头脱口而出:“蔡伸词:嬛嬛一袅楚宫腰。正是臣女闺名。”一剪梅·堆枕乌云堕翠翘 (蔡伸)堆枕乌云堕翠翘。午梦惊回,满眼春娇。嬛嬛一袅楚宫腰。那更春来,

《斯巴达之魂》:通往鲁迅的重要驿站

《斯巴达之魂》:通往鲁迅的重要驿站——兼论青年鲁迅的思想起点杜光霞1鲁迅,一个太过独异的个体,卓然特立于其民族、时代与社会群体之中。从中国近现代至当代,我们无法将鲁迅纳入某一个相对较为持久的思想文化或文学群落,甚至无法找

声明:《《高质量程序设计指南》--strcpy 的实现 c语言实现strcpy函数》为网友瘋釨俇分享!如侵犯到您的合法权益请联系我们删除