FreeBSD's generic implementation of memchr
做:为什么FreeBSD的memchr实现在它的条件下增加它的指针?
void *
memchr(const void *s, int c, size_t n)
{
if (n != 0) {
const unsigned char *p = s;
do {
if (*p++ == (unsigned char)c)
return ((void *)(p - 1));
} while (--n != 0);
}
return (NULL);
}
这对我来说似乎是不必要的复杂;最初的n != 0
检查与do
- while
只是为了避免p
声明似乎完全没有意义。然而,我在为什么循环体确实特别感兴趣:
if (*p++ == (unsigned char)c)
return ((void *)(p - 1));
,而不是更直截了当:
if (*p == (unsigned char)c)
return ((void *) p);
++p;
是否内联后递增与病情有一定优化的好处对于一些编译器/平台?
您是否检查编译器生成的机器码(使用优化)?这与你的方法有什么不同?'p'的_definition_是否生成代码?是的,你会错过考虑最可能编写代码的时间以及当时优化编译器的优劣。相当多的CPU有“减量和分支如果不是零”指令。 – Olaf
@Olaf我确实使用godbolt来比较实现和gcc(使用-O3,再次使用-Os)。我不擅长汇编,但直截了当的版本似乎产生较少的指令。 – jamesdlin
重新阅读我的评论,我增加了很多。你检查每个运行BSD的目标? x86并不是一个广泛传播的平台。该代码甚至可以用于8位和16位MCU,其数量超过x86和ARM数十年。 – Olaf