gpt4 book ai didi

有人可以解释为什么这个功能是这样的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:30:59 25 4
gpt4 key购买 nike

我正在查看 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;
}

谁能解释一下代码背后的逻辑?

谢谢。

最佳答案

是的,这是一个部分展开的循环。

4:

1) 一般大小:在更多分支(小数字)和更大的代码大小(大数字)之间总是存在权衡。

2) 具体大小(4,而不是 5):正如 Joachim Isaksson 指出的,如果选择 5 而不是 4,则循环之前的 >> 需要更改为除法。他说在某些(例如嵌入式)CPU 上,这变得很重要。 (通常我们只考虑循环成本,而不是它的设置,但他可能是对的,因为大多数字符串往往都很小!)

请注意,如果您想将循环展开到任何数字(无论是否为 2 的幂),那么您可以 - 而不是进行除法并维护 n4 - 您可以计算 s1 的结束指针,并在末尾检查 s1 与它:

char* s1end = s1 + n;
do {...} while(s1 < s1end);

关于有人可以解释为什么这个功能是这样的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20592653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com