strlen C语言源码实现
#include<stdio.h>
#include<assert.h>
typedef unsigned long ulong;
size_t stlen_c(const char* str)
{
const char* char_ptr;
const unsigned long int* longword_ptr;
unsigned long int longword, himagic, lomagic;
for (char_ptr = str; ((unsigned long int)char_ptr
& (sizeof(longword) - 1)) != 0;
++char_ptr)
if (*char_ptr == '\0')
return char_ptr - str;
longword_ptr = (unsigned long int*)char_ptr;
himagic = 0x80808080L;
lomagic = 0x01010101L;
if (sizeof(longword) > 4)
{
himagic = ((himagic << 16) << 16) | himagic;
lomagic = ((lomagic << 16) << 16) | lomagic;
}
//if (sizeof(longword > 8)) //这个肯定是要写的
//abort(); //C 库函数 void abort(void) 中止程序执行,直接从调用的地方跳出
for (;;)
{
longword = *longword_ptr++;
if (((longword - lomagic) & ~longword & himagic) != 0)
{
const char* cp = (const char*)(longword_ptr - 1);
if (cp[0] == 0)
return cp - str;
if (cp[1] == 0)
return cp - str + 1;
if (cp[2] == 0)
return cp - str + 2;
if (cp[3] == 0)
return cp - str + 3;
if (sizeof(longword) > 4)
{
if (cp[4] == 0)
return cp - str + 4;
if (cp[5] == 0)
return cp - str + 5;
if (cp[6] == 0)
return cp - str + 6;
if (cp[7] == 0)
return cp - str + 7;
}
}
}
}
int main(void)
{
//char* p = "string";
int len = 0;
len = stlen_c("string");
printf("%d\n", len);
}
结语
for 循环中的longword 是每八个字节检查一次;前面已经char_ptr指针已经指向了8的倍数的地址,从这里开始,先强制类型转换,后面每8个字节检查一次。
[1]: https://blog.csdn.net/weixin_43476040/article/details/103245069?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-1-103245069-blog-125643497.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-1-103245069-blog-125643497.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=2