首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么要将strlen重新实现为loop+subtraction?

为什么要将strlen重新实现为loop+subtraction?
EN

Stack Overflow用户
提问于 2011-07-27 18:31:05
回答 1查看 700关注 0票数 19

灵感来自于来自SQLite3的以下代码的this question

代码语言:javascript
复制
 static int strlen30(const char *z){
    const char *z2 = z;
    while( *z2 ){ z2++; }
    return 0x3fffffff & (int)(z2 - z);
 }

这伴随着一个commit message,说这个函数有助于int溢出。

我对这部分特别感兴趣:

代码语言:javascript
复制
 const char *z2 = z;
 while( *z2 ){ z2++; }

对我来说,这个循环使z2前进,直到z2指向空终止符。然后,z2-z生成字符串长度。

为什么不对这部分使用strlen(),并像这样重写:

代码语言:javascript
复制
return 0x3fffffff & (int)(strlen(z));

为什么不使用strlen()而使用loop+subtraction?strlen()不能做的事,loop+subtraction能做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-28 09:15:26

为什么将strlen重新实现为loop+subtraction?

我怀疑真正的答案是程序员喜欢它,但另一个潜在的理由/合理性是循环是内联的(与strlen30本身是否内联无关),而在许多系统上,strlen是一个离线的函数调用(例如Linux/GCC)。如果绝大多数字符串是空的或短的(尽管对长的字符串进行了“特殊”处理),那么对于常见的情况,这可能会产生轻微的性能提升。光是这种可能性就可能足以让喜欢代码的程序员敲击键盘。对于较长的字符串,我希望库strlen通常是最优的(考虑到它缺乏特定于应用程序的字符串长度的知识)。

有些系统甚至可能不会从这种内联中受益,因为strlen提供了自己的内联/外联混合,可以快速内联检查空的、单字符的、可能是两个字符的字符串,然后调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6842880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档