灵感来自于来自SQLite3的以下代码的this question:
static int strlen30(const char *z){
const char *z2 = z;
while( *z2 ){ z2++; }
return 0x3fffffff & (int)(z2 - z);
}
这伴随着一个commit message,说这个函数有助于int
溢出。
我对这部分特别感兴趣:
const char *z2 = z;
while( *z2 ){ z2++; }
对我来说,这个循环使z2
前进,直到z2
指向空终止符。然后,z2-z
生成字符串长度。
为什么不对这部分使用strlen()
,并像这样重写:
return 0x3fffffff & (int)(strlen(z));
为什么不使用strlen()
而使用loop+subtraction?strlen()
不能做的事,loop+subtraction能做什么?
发布于 2011-07-28 09:15:26
为什么将strlen重新实现为loop+subtraction?
我怀疑真正的答案是程序员喜欢它,但另一个潜在的理由/合理性是循环是内联的(与strlen30
本身是否内联无关),而在许多系统上,strlen
是一个离线的函数调用(例如Linux/GCC)。如果绝大多数字符串是空的或短的(尽管对长的字符串进行了“特殊”处理),那么对于常见的情况,这可能会产生轻微的性能提升。光是这种可能性就可能足以让喜欢代码的程序员敲击键盘。对于较长的字符串,我希望库strlen
通常是最优的(考虑到它缺乏特定于应用程序的字符串长度的知识)。
有些系统甚至可能不会从这种内联中受益,因为strlen
提供了自己的内联/外联混合,可以快速内联检查空的、单字符的、可能是两个字符的字符串,然后调用。
https://stackoverflow.com/questions/6842880
复制相似问题