C语言函数strlen源码剖析.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言函数strlen源码剖析

C语言函数strlen源码剖析 发布日期:2009-04-06?? 来源:互联网?? 作者:佚名 strlen源码剖析 学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效。恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简单的函数strlen研究了一下,并对各种实现作了简单的效率测试。 strlen的函数原形如下: ??????size_t strlen(const char *str); strlen返回str中字符的个数,其中str为一个以\0结尾的字符串(a null-terminated string)。 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? ????????; 5?????return?(cp?-?str?-?1 ); 6?} 2. 高效实现 很显然,标准库的实现肯定不会如此简单,上面的strlen_a以及strlen_b都是一次判断一个字符直到发现\0为止,这是非常低效的。比较高效的实现如下(在这里WORD表示计算机中的一个字,不是WORD类型): (1) 一次判断一个字符直到内存对齐,如果在内存对齐之前就遇到\0则直接return,否则到(2); (2) 一次读入并判断一个WORD,如果此WORD中没有为0的字节,则继续下一个WORD,否则到(3); (3) 到这里则说明WORD中至少有一个字节为0,剩下的就是找出第一个为0的字节的位置然后return。 NOTE: 数据对齐(data alignment),是指数据所在的内存地址必须是该数据长度的整数倍,这样CPU的存取速度最快。比如在32位的计算机中,一个WORD为4 byte,则WORD数据的起始地址能被4整除的时候CPU的存取效率比较高。CPU的优化规则大概如下:对于n字节(n = 2,4,8...)的元素,它的首地址能被n整除才能获得最好的性能。 为了便于下面的讨论,这里假设所用的计算机为32位,即一个WORD为4个字节。下面给出在32位计算机上的C语言实现(假设unsigned long为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(ulong)?-?1))?!=?0 ; 11?????????++ char_ptr)?{ 12?????????if?(*char_ptr?==?\0 ) 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?????????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?????????????????return

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档