gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:23:52 25 4
gpt4 key购买 nike

我尝试理解并重写 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. 未对齐的起始区域太小,以至于在指针对齐之前就到达缓冲区末尾的情况。

关于c - memchr 源代码中的长字边界对齐到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com