【发布时间】:2013-12-15 08:28:52
【问题描述】:
我正在查看来自 GNU C 库 glibc-2.18 的函数,这是我为 strncmp.c 找到的代码
看着它,我不明白为什么要这样写。这个循环展开了吗? 为什么不使用 5 或 10 而不是 4? 为什么他们这样写而不是使用更直接的方法?
/* Compare no more than N characters of S1 and S2,
returning less than, equal to or greater than zero
if S1 is lexicographically less than, equal to or
greater than S2. */
int
STRNCMP (const char *s1, const char *s2, size_t n)
{
unsigned char c1 = '\0';
unsigned char c2 = '\0';
if (n >= 4)
{
size_t n4 = n >> 2;
do
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c1 - c2;
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c1 - c2;
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c1 - c2;
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c1 - c2;
} while (--n4 > 0);
n &= 3;
}
while (n > 0)
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c1 - c2;
n--;
}
return c1 - c2;
}
谁能解释一下代码背后的逻辑?
谢谢。
【问题讨论】:
-
@Mat 看不到任何
Duff关于这段代码的内容。 -
是的,这看起来像是手动展开的循环。我们的想法是它会更快,因为更少的测试和跳转。