Что такое выравнивание по границе длинного слова в исходном коде memchr? - PullRequest
0 голосов
/ 17 декабря 2018

Я пытался понять и переписать функцию 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 голосов
/ 17 декабря 2018

Оптимизированная часть memchr() требует, чтобы она работала с указателем, выровненным на четыре байта.Однако не требуется, чтобы s, передаваемый в функцию, было выровнено таким образом.

Цель этого первого цикла - продвинуть s, если необходимо, достаточно далеко, чтобы он был правильно выровнен дляоптимизированная часть.Цикл так же сложен, как и он, потому что он имеет дело с двумя крайними случаями:

  1. Ищется символ в первых нескольких невыровненных байтах, и
  2. случай, когда невыровненная начальная область настолько мала, что вы достигаете конца буфера до выравнивания указателя.
...