私のCスキルを磨くために、eglibcのソースコードをダウンロードしてstrncpyを見つけました。私はなぜ彼がn < = 4の場合を区別して4つのテストをしたのかわかりません。strncmpの実装
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;
}
私は知らないメモリレイアウトと関係があるかもしれませんが、私に教えてください。
は、ループアンローリングのように見える:https://en.wikipedia.org/wiki/Loop_unrolling –
@SteveSummit情報のためにあなたをとても感謝しています。 –
もう一歩、あなたはDuffのデバイスを持っていたでしょう... – wildplasser