为什么FreeBSD的memchr实现会在其条件下增加指针?

jam*_*lin 6 c freebsd

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);
}
Run Code Online (Sandbox Code Playgroud)

对我来说似乎不必要的复杂; 初步n != 0检查do- while只是为了避免p声明似乎完全没有意义.但是,我特别感兴趣的是循环体的作用:

if (*p++ == (unsigned char)c)
    return ((void *)(p - 1));
Run Code Online (Sandbox Code Playgroud)

而不是更直接:

if (*p == (unsigned char)c)
    return ((void *) p);
++p;
Run Code Online (Sandbox Code Playgroud)

使用条件内联后增量是否对某些编译器/平台有一些优化优势?

Ism*_*eno 2

指针后自增的情况是为了让那个时代的编译器(例如PCC)能够在DEC机器中使用自增寻址模式(就像Mark Plotnick在评论中提到的那样)。

\n\n

由于所有 DEC 机器都支持自动递增寻址,因此这种编码循环方式曾经非常常见(顺便说一句,m68k 支持相同的优化)。

\n\n

do-while另一方面,循环只是因为在 na\xc3\xaff 编译器上它往往会产生更好的代码,而不仅仅是为了避免设置p.

\n\n

也不应该对于现代编译器来说,

\n