memchr 源代码中的长字边界对齐到底是什么?

What really is alignment on a longword boundary in the source code of memchr?

我试图理解并重写 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 中尝试过不使用,但我不时遇到一些错误,但我不知道为什么。

memchr() 的优化部分要求它使用四字节对齐的指针。但是,不要求传递给函数的 s 以这种方式对齐。

第一个循环的目的是在必要时将 s 推进到足以使其与优化部分正确对齐的程度。循环之所以如此复杂,是因为它必须处理两种边缘情况:

  1. 要搜索的字符在第一个非对齐的几个字节中,并且
  2. 未对齐的起始区域太小以至于您在使指针对齐之前到达缓冲区末尾的情况。