LLVM.
А как решать задачу, если целевой компилятор - MSVC, в подобные оптимизации умеющий крайне плохо?
Нужно отобразить десяток-другой коротких строк в числа и обратно.
ну сделайте нужную часть на Clang или icx
Увы, не подходит)
Может frozen подойдёт, там вроде в compile time perfect hash строится. Хотя десяток-другой это можно и перебором, даже без всяких оптимизаций.
Да оно норм работает, но это O(длины строки). Но если важно, можно обычно лучше написать, засчет того что размер строк обычно разный. То есть switch по размеру + switch по 1 букве хватает для большинства константных строк. Но это нужно вручную писать :(
В данном случае вообще всё сводится к предположению что msvc не умеет в оптимизации :) И думаю надобность в оптимизациях тоже только предположение.
Ну и да, на небольших наборах простой цикл наверное быстрее работает потому что сразу отбрасываются не проходящие по размеру и memcmp делается только на равных по размеру строках. И даже если их не один, это всё равно может быть быстрее чем хэш.
Хм... я кстати до конца не разбирался. Но там случаем не FNV? Я вот подумал это очень плохой хэш для того чтобы быть perfect.
Он же не просто O, он дорогой, там умножения
Ну относительно, но да, какой нибудь wyhash/city64 дешевле
Не, fnv это точно не для pfh :) Это если не заморачиваться как в gperf. Самый простой вариант это нагенерить рандом с которым вход можно просто поксорить.
Обсуждают сегодня