高效的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
- 高效的strcpy函数
- strcpy的函数原型
- strcpy函数的实现
- strcpy 函数的原型
- 经典的strcpy 函数
- strcpy函数的思考
- 安全的strcpy函数
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的原型
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- 第三方框架(可信框架)
- KVO示例
- HDU 4815 Little Tiger vs. Deep Monkey 01背包
- IOS 代码规范
- IOS 单列标准创建方案
- 高效的strcpy函数
- 高效的strlen函数
- 在UITableView中iOS UITableViewDelegate UITableViewDataSource执行顺序
- 各种initcall的执行先后顺序(module_init、postcore_initcall、arch_initcall、subsys_initcall、 fs_initcall)
- 二维数组旋转
- 苹果审核24项(中文版)
- iOS:KVO的概述与使用
- Ubuntu14.04 找不到ia32-lib 解决方案
- 易语言光速网络引擎教程第一课