strlen源码剖析

strlen源码剖析

ID:41128355

大小:161.50 KB

页数:22页

时间:2019-08-17

strlen源码剖析_第1页
strlen源码剖析_第2页
strlen源码剖析_第3页
strlen源码剖析_第4页
strlen源码剖析_第5页
资源描述:

《strlen源码剖析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、strlen源码剖析学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++RuntimeLibrary)作为底层的函数库,实现必然高效。恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简单的函数strlen研究了一下,并对各种实现作了简单的效率测试。strlen的函数原形如下:      size_tstrlen(constchar*str);strlen返回str中字符的个数,其中str为一个以''结尾的字符串(anull-terminatedstring)。1.简单实现如果不管效率,最简单的实现只需要4行代码:1 size_t strlen_a

2、(const char *str) {2     size_t length = 0;3     while (*str++)4         ++length;5     return length;6 }也许可以稍加改进如下:1 size_t strlen_b(const char *str) {2     const char *cp = str;3     while (*cp++)4         ;5     return (cp - str - 1);6 }2.高效实现很显然,标准库的实现肯定不会如此简单,上面的strlen_a以及strlen_b都是一次判断

3、一个字符直到发现''为止,这是非常低效的。比较高效的实现如下(在这里WORD表示计算机中的一个字,不是WORD类型):(1)一次判断一个字符直到内存对齐,如果在内存对齐之前就遇到''则直接return,否则到(2);(2)一次读入并判断一个WORD,如果此WORD中没有为0的字节,则继续下一个WORD,否则到(3);(3)到这里则说明WORD中至少有一个字节为0,剩下的就是找出第一个为0的字节的位置然后return。NOTE:数据对齐(dataalignment),是指数据所在的内存地址必须是该数据长度的整数倍,这样CPU的存取速度最快。比如在32位的计算机中,一个WO

4、RD为4byte,则WORD数据的起始地址能被4整除的时候CPU的存取效率比较高。CPU的优化规则大概如下:对于n字节(n=2,4,8...)的元素,它的首地址能被n整除才能获得最好的性能。为了便于下面的讨论,这里假设所用的计算机为32位,即一个WORD为4个字节。下面给出在32位计算机上的C语言实现(假设unsignedlong为4个字节): 1 typedef unsigned long ulong; 2  3 size_t strlen_c(const char *str) { 4  5     const char *char_ptr; 6     const ulon

5、g *longword_ptr; 7     register ulong longword, magic_bits; 8  9     for (char_ptr = str; ((ulong)char_ptr 10         & (sizeof(ulong) - 1)) != 0;11         ++char_ptr) {12         if (*char_ptr == '')13             return char_ptr - str;14     }15 16     longword_ptr = (ulong*)char_ptr;17

6、 18     magic_bits = 0x7efefeffL;19 20     while (1) {21 22         longword = *longword_ptr++;23 24         if ((((longword + magic_bits) ^ ~longword) & ~magic_bits) != 0) {25 26             const char *cp = (const char*)(longword_ptr - 1);27             28             if (cp[0] == 0)29    

7、             return cp - str;30             if (cp[1] == 0)31                 return cp - str + 1;32             if (cp[2] == 0)33                 return cp - str + 2;34             if (cp[3] == 0)35                 return cp - str + 3;36         }

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。