看见别人反汇编的strlen的代码,觉得不错,添加注释贴chulai
size_t strlen2(const char *str)
{
unsigned v;
const char *p = str;
//用于字节对齐
while(*p && ((unsigned)p & 3))
p ++;
if (*p == 0)
return (size_t)(p - str);
//每次比较四个字节
for (v = 0; !v; p += 4) {
//如果字节有个字节为0,那么减去0x01010101之后,对应字节的第一个bit就为1
v = (*(unsigned*)p - 0x01010101) & 0x80808080;
//判断去除第一个bit为1的字符(如汉字)
if (v)
v &= ~*(unsigned*)p;
}
//找到了结尾的位置,就在最近的4个byte内
for (; (v & 0xff) == 0; p ++)
v >>= 8;
return (size_t)(p - str - 4);
}