欢迎来到天天文库
浏览记录
ID:39547587
大小:66.00 KB
页数:12页
时间:2019-07-06
《C语言函数strlen源码剖析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C语言函数strlen源码剖析发布日期:2009-04-06 来源:互联网 作者:佚名strlen源码剖析学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++RuntimeLibrary)作为底层的函数库,实现必然高效。恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简单的函数strlen研究了一下,并对各种实现作了简单的效率测试。strlen的函数原形如下: size_tstrlen(constchar*str);strlen返回str中字符的个数,其中str为一个以' '结尾的字符串
2、(anull-terminatedstring)。1.简单实现如果不管效率,最简单的实现只需要4行代码:1 size_t strlen_a(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
3、 ;5 return (cp - str - 1);6 }2.高效实现很显然,标准库的实现肯定不会如此简单,上面的strlen_a以及strlen_b都是一次判断一个字符直到发现' '为止,这是非常低效的。比较高效的实现如下(在这里WORD表示计算机中的一个字,不是WORD类型):(1)一次判断一个字符直到内存对齐,如果在内存对齐之前就遇到' '则直接return,否则到(2);(2)一次读入并判断一个WORD,如果此WORD中没有为0的字节,则继续下一个WORD,否则到(3);(3)到这里则说明WOR
4、D中至少有一个字节为0,剩下的就是找出第一个为0的字节的位置然后return。NOTE:数据对齐(dataalignment),是指数据所在的内存地址必须是该数据长度的整数倍,这样CPU的存取速度最快。比如在32位的计算机中,一个WORD为4byte,则WORD数据的起始地址能被4整除的时候CPU的存取效率比较高。CPU的优化规则大概如下:对于n字节(n=2,4,8...)的元素,它的首地址能被n整除才能获得最好的性能。为了便于下面的讨论,这里假设所用的计算机为32位,即一个WORD为4个字节。下面给出在32位计算机上的C语言实现
5、(假设unsignedlong为4个字节): 1 typedef unsigned long ulong; 2 3 size_t strlen_c(const char *str) { 4 5 const char *char_ptr; 6 const ulong *longword_ptr; 7 register ulong longword, magic_bits; 8 9 for (char_ptr = str; ((ulong)char_ptr 10 & (sizeof
6、(ulong) - 1)) != 0;11 ++char_ptr) {12 if (*char_ptr == ' ')13 return char_ptr - str;14 }15 16 longword_ptr = (ulong*)char_ptr;17 18 magic_bits = 0x7efefeffL;19 20 while (1) {21 22 longword = *longword_ptr++;23 24
7、 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 return cp - str;30 if (cp[1] == 0)31 r
8、eturn cp - str + 1;32 if (cp[2] == 0)33 return cp - str + 2;34 if (cp[3] == 0)35
此文档下载收益归作者所有