Оптимизация для строк предназначена для библиотек, а не для компиляторов.Если вам нужны строковые идентификаторы, перечисления являются одной из возможностей.Но лучшим вариантом, особенно для печати и отладки, является класс строки идентификатора фиксированной длины.
Он может быть конвертирован в const char *
и std::string
, но у него будет нулевое распределение памяти.Вместо этого это будет просто обертка вокруг 32-символьного (или как вам угодно) массива.
Самое приятное то, что, поскольку это идентификатор, вас не волнует символьный символ ASCIIсравнения.operator<
может просто прочитать 32-символьный массив как 8 uint32_t
с или даже как 4 uint64_t
с.Все, что вам нужно - это и заказ, а не конкретный заказ.operator==
может выполнять аналогичные тесты.
Это довольно простой класс для написания.Если вам нужно сравнение без учета регистра, вы можете просто преобразовать строку в строчные, когда копируете ее в объект.
Если вам нужны строки длиннее 31 байта (одна для терминатора \0
), тогда япредложил бы обрезать строку до размера.Но обрезать от середина данной строки, а не до конца.Начало и конец идентификаторов имеют тенденцию быть более уникальными, чем середина.Вы могли бы даже поместить некоторые специальные символы в усеченную строку, чтобы определить, что это усеченная версия.
Также можно взять эту идею и добавить хеш в строку.Таким образом, первые 4 байта будут хэшем оригинальной строки, а не усечения.В сравнительных тестах будет использоваться только хеш, а остальные 28 байтов предназначены для удобочитаемости.