这里是我在glibc中找到的strcmp
函数:
int
STRCMP (const char *p1, const char *p2)
{
const unsigned char *s1 = (const unsigned char *) p1;
const unsigned char *s2 = (const unsigned char *) p2;
unsigned char c1, c2;
do
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2);
return c1 - c2;
}
这是一个相当简单的函数,在
while
循环体中,用*s1
和*s2
的值初始化c1
和c2
,并继续执行,直到c1
为nul
或c1
和c2
的值相等,然后返回c1
和c2
之间的差异。
我不理解的是为什么要使用s1
和s2
变量。除了它们是unsigned char
类型外,它们还像参数p1
和p2
一样是const
类型。那么为什么不在while循环体内直接使用p1
和p2
并进行强制转换呢?在这种情况下,使用这两个额外的变量是否使函数更加优化?因为这里是我在github上找到的FreeBSD版本的相同函数:
int
strcmp(const char *s1, const char *s2)
{
while (*s1 == *s2++)
if (*s1++ == '\0')
return (0);
return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1));
}
在他们的版本中,他们甚至没有使用任何额外的变量。
提前感谢您的答复。
PS:在询问这个问题之前,我确实在互联网上搜索了这个特定的事实,但是我什么也没找到。
我还想知道为什么glibc使用这些额外变量而不是直接在while里强制转换参数p1和p2。