字符串的快速字符串比较,具有C中的精确长度

J_A*_*ilu 8 c string algorithm

有没有人知道对于具有正好6个字符的字符串进行字符串比较的最快方法是什么?

我的想法如下:

inline bool jfStrEq6(const char *s1, const char *s2)
{
    uint64_t s1ui64 = *((uint64_t *)s1);
    uint64_t s2ui64 = *((uint64_t *)s2);

    return (s1ui64 & 0x0000ffffffffffff) == (s2ui64 & 0x0000ffffffffffff);
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 9

这是未定义的行为:您读取了6个字符的字符串的最后一个有效字节.只有七个而不是八个字节可以读取.此外,字节顺序很重要:您可能需要0xffffffffffff0000某些体系结构.

如果您知道字符串的长度,请使用memcmp:

inline bool jfStrEq6(const char *s1, const char *s2) {
    return !memcmp(s1, s2, 6);
}
Run Code Online (Sandbox Code Playgroud)

有可能,您的优化器会将其转换为CPU内在函数,以便在您的平台上实现最快的比较.

  • 作为一个小的风格点,考虑使用`== 0`,因为`memcmp()`的返回值不是布尔值.我也意识到它也是正确的. (2认同)

小智 -2

你觉得异或怎么样?

返回!(s1ui64^s2ui64);

但我不确定它是否真的更快,但至少更短。

  • @zen My -1 是由于忽略了这种方法的危险,请参阅 dasblinkenlight 的答案以进行讨论。 (2认同)