Почему реализация std::any использует typeid?

#c #optimization #rtti #libc #stdany

#c #оптимизация #rtti #libc #stdany

Вопрос:

Кажется, это std::any отлично работает в GCC и Clang даже при компиляции с помощью -fno-rtti.

Глядя на исходный код libc , я вижу, что они просто используют простой трюк:

они принимают адрес переменной, шаблонной для типа в any, так что именно так они получают уникальный идентификатор.

Но этот код активен только тогда, когда RTTI не включен.

Это заставило меня задуматься. Почему они вообще используют RTTI в первую очередь? Почему не всегда использовать это решение? Я понятия не имею, почему typeid это было бы быстрее, чем простое сравнение указателей (на статическую переменную, которая создается для каждого типа).

Комментарии:

1. Это может быть для поддержки полиморфных типов, в которых тип переменной не соответствует типу объекта

2. @AlanBirtles вы имеете в виду что-то вроде этого? Похоже, это не работает даже с RTTI godbolt.org/z/MEc3vb

3. Не могли бы вы, пожалуйста, дать ссылку на то, где реализация использует RTTI?

4. @xskxzr ты имеешь в виду это? github.com/llvm/llvm-project/blob/main/libcxx/include/any

5. @jannarc Имеет ли другое решение без typeid такого же наблюдаемого поведения? Если это так, то, поскольку правило «как если бы», другое решение определенно подходит.