为什么要将strlen重新实现循环?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

关于SQLite 3中的以下代码:

 static int strlen30(const char *z){
    const char *z2 = z;
    while( *z2 ){ z2++; }
    return 0x3fffffff & (int)(z2 - z);
 }

这个函数有助于int溢出。

 const char *z2 = z;
 while( *z2 ){ z2++; }

为什么不使用strlen()这部分的内容和重写如下:

return 0x3fffffff & (int)(strlen(z));
提问于
用户回答回答于

有些系统甚至可能无法从这种内联中获益,因为strlen提供它自己的,或内联/线外混合,快速内联检查空,一个字符,也许两个字符字符串,然后调用。

用户回答回答于

如果size_t作为返回类型:

/*
 ** Compute a string length that is limited to what can be stored in
 ** lower 30 bits of a 32-bit signed integer.
 */
static int strlen30(const char *z){
    const char *z2 = z;
    while( *z2 ){ z2++; }
    return 0x3fffffff & (int)(z2 - z);
}

扫码关注云+社区