Хочется совершить некоторый шаг в сторону reflection.
Есть программа, которая хранит свои log-файлы в бинарном проприетарном формате. Выглядят эти дампы довольно изящно — очень "дешевая" в плане скорости работы блочная структура: размер объекта (в байтах), хеш типа объекта — typeid(T).hash_code(), и бинарное содержимое объекта.
Вопрос вот в чем. Можно ли найти конкретный type_info по hash_code()? Или перечислить все type_info. Может, есть какой-то недокументированный ABI? По примеру функции abi::__cxa_demangle у GCC.
Здравствуйте, SkyDance, Вы писали:
SD>Хочется совершить некоторый шаг в сторону reflection.
SD>Есть программа, которая хранит свои log-файлы в бинарном проприетарном формате. Выглядят эти дампы довольно изящно — очень "дешевая" в плане скорости работы блочная структура: размер объекта (в байтах), хеш типа объекта — typeid(T).hash_code(), и бинарное содержимое объекта.
А разве вы можете быть уверены в уникальности хэша? Что будет при коллизции (когда два разных типа вернут один хэш)? Да и вообще, никто ведь в общем случае не гарантирует, что хэш код не будет меняться от запуска к запуску или от версии к версии. Поэтому в большинстве платформ сохранять хэш-код для последующего получения объекта не рекомендуется.
Я, конечно, отталкиваюсь от базовых требований к хэш-функциям, возможно ваши хэш-функции дают более строгую гарантию, но я не уверен, что на них можно расчитывать.
ST>А разве вы можете быть уверены в уникальности хэша?
В gcc да, кроме того, есть pending proposal для внесения этого в стандарт. В любом случае, коллизии такого рода меня не беспокоят на данном этапе. Это первое. Второе — сам вопрос, который не предполагает обсуждение хеша, а куда более конкретен. К сожалению, длительное гугление и даже bing-ование показало, что никто этого не знает, следующим этапом будет копать исходники gcc.
Здравствуйте, SergeyT., Вы писали:
ST>Здравствуйте, SkyDance, Вы писали:
ST>Да и вообще, никто ведь в общем случае не гарантирует, что хэш код не будет меняться от запуска к запуску или от версии к версии.
This.
Так что, даже если вы сохраните хэш, а потом, каким-то чудесным образом, найдете тип с таким хэшем, то никаким образом не сможете быть уверены, что это тот же самый тип.
A>Так что, даже если вы сохраните хэш, а потом, каким-то чудесным образом, найдете тип с таким хэшем, то никаким образом не сможете быть уверены, что это тот же самый тип.
Напомню еще раз, вопрос задан совсем другой.
Есть ли способ найти все type_info объекты, или как-то по hash найти нужный type_info?