Самый быстрый способ сравнить две строки одинаковой длины - PullRequest
1 голос
/ 09 ноября 2011

Строки имеют фиксированную длину 8, содержат буквенно-цифровые символы и дополняются справа пробелами.

Т.е. *

"STRING1 "
"STR2    "
"S       "

и т. Д.* может быть самый быстрый здесь?

Ответы [ 2 ]

10 голосов
/ 09 ноября 2011

Если вы гарантируете, что строки выровнены по 8-байтовой границе через атрибуты, специфичные для компилятора, вы можете сделать:

uint64_t a = *((uint64_t *) "STRING1 ");
uint64_t b = *((uint64_t *) "STR2    ");

Тогда a == b должен уступить одной 64-битной инструкции.

Или, если это просто постоянные неизменяемые строки (хранящиеся в области процесса, доступной только для чтения), вы можете продолжить сравнение самих указателей const char *. Это все еще надежный тест, поскольку строковый литерал, который появляется дважды в текущей единице перевода, должен ссылаться на одну и ту же память:

/* fails because the two strings are stored at different locations */
"STRING1 " == "STR2    "
/* should succeed, even the silliest compiler should merge both literals */
"STRING1 " == "STRING1 "
4 голосов
/ 09 ноября 2011

Если строки имеют фиксированную одинаковую длину, то memcmp - хороший подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...