我试图理解并重写memchr函数,但在代码开头发现了一些奇怪的东西。
我们可以读到:
#include "libc.h"
#include <unistd.h>
void *my_memchr(void const *s, int c_in, size_t n)
{
unsigned const char *char_ptr;
unsigned char c;
/*
** t_longword is a typedef for unsigned long int **
*/
t_longword *longword_ptr;
t_longword magic;
t_longword mega_c;
c = (unsigned char)c_in;
for (char_ptr = (unsigned const char*)s; n > 0
&& (size_t)char_ptr % sizeof(t_longword) != 0; --n, ++char_ptr)
{
if (*char_ptr == c)
return ((void*)char_ptr);
}
longword_ptr = (t_longword*)char_ptr;
print_bits(*longword_ptr);
magic = 0x101010101010100;
mega_c = c | (c << 8);
mega_c |= mega_c << 16;
mega_c |= mega_c << 32;
/*
** I didn't finish to rewrite the entire function**
*/
return (NULL);
}
我想知道为什么第一个循环是强制性的?我已经尝试过不使用strlen函数,并且不时有一些错误,但是我不知道为什么。
答案 0 :(得分:0)
memchr()
的优化部分要求它与四字节对齐的指针一起使用。但是,不要求传递给函数的s
以此方式对齐。
第一个循环的目的是在必要时将s
向前推进足够远的距离,以使其针对优化部分正确对齐。循环是如此复杂,因为它必须处理两个边缘情况: