#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
такого же наблюдаемого поведения? Если это так, то, поскольку правило «как если бы», другое решение определенно подходит.