8

正確に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);
}
4

2 に答える 2

9

これは未定義の動作です。6 文字の文字列の最後の有効なバイトを超えて読み取ります。8 バイトではなく 7 バイトのみが読み取り可能です。さらに、バイト順も重要です0xffffffffffff0000。一部のアーキテクチャでは必要になる場合があります。

文字列の長さがわかっている場合は、次を使用しますmemcmp

inline bool jfStrEq6(const char *s1, const char *s2) {
    return !memcmp(s1, s2, 6);
}

おそらく、オプティマイザはこれを CPU 組み込みに変換して、プラットフォームで可能な最速の比較を行います。

于 2013-01-28T14:28:08.557 に答える
-2

xorについてどう思いますか?

return !(s1ui64 ^ s2ui64);

しかし、それが本当に速いかどうかはわかりませんが、少なくとも短いです。

于 2013-01-28T14:27:43.123 に答える