灵感来自于来自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
复制相似问题