Если вы гарантируете, что строки выровнены по 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 "