redis-字符串
/* Return the length of the null-terminated string STR.Scan forthe null terminator quickly by testing four bytes at a time.*/size_tstrlen (str) const char *str;
{const char *char_ptr;const unsigned long int *longword_ptr;unsigned long int longword, himagic, lomagic;/* Handle the first few characters by reading one character at a time.
Do this until CHAR_PTR is aligned on a longword boundary.*/
for (char_ptr = str;
((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
++char_ptr) if (*char_ptr == '\0') return char_ptr - str;/* All these elucidatory comments refer to 4-byte longwords,
but the theory applies equally well to 8-byte longwords.*/
longword_ptr = (unsigned long int *) char_ptr;/* Bits 31, 24, 16, and 8 of this number are zero.Call these bits
the "holes."Note that there is a hole just to the left of
each byte, with an extra at the end:
bits:01111110 11111110 11111110 11111111
bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
The 1-bits make sure that carries propagate to the next 0-bit.
The 0-bits provide holes for carries to fall into.*/
himagic = 0x80808080L;
lomagic = 0x01010101L;if (sizeof (longword) > 4)
{ /* 64-bit version of the magic.*/
/* Do the shift in two steps to avoid a warning if long has 32 bits.*/
himagic = ((himagic
页:
[1]