memchr的源代码中的长字边界对齐实际上是什么?

时间:2018-12-17 19:46:10

标签: c memory libc

我试图理解并重写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函数,并且不时有一些错误,但是我不知道为什么。

1 个答案:

答案 0 :(得分:0)

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

第一个循环的目的是在必要时将s向前推进足够远的距离,以使其针对优化部分正确对齐。循环是如此复杂,因为它必须处理两个边缘情况:

  1. 要搜索的字符位于前几个未对齐的字节中,并且
  2. 如果未对齐的起始区域很小,以至于在对齐指针之前到达缓冲区的末尾。