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)
使用条件内联后增量是否对某些编译器/平台有一些优化优势?
指针后自增的情况是为了让那个时代的编译器(例如PCC)能够在DEC机器中使用自增寻址模式(就像Mark Plotnick在评论中提到的那样)。
\n\n由于所有 DEC 机器都支持自动递增寻址,因此这种编码循环方式曾经非常常见(顺便说一句,m68k 支持相同的优化)。
\n\ndo-while另一方面,循环只是因为在 na\xc3\xaff 编译器上它往往会产生更好的代码,而不仅仅是为了避免设置p.
也不应该对于现代编译器来说,
\n| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |