Сегодня пришел мой коллега и задал мне вопрос, упомянутый в названии.
В настоящее время он пытается уменьшить двоичный код базы данных, который также используется для небольших целей (например, Cortex M3 и так далее). По-видимому, они решили скомпилировать с включенным RTTI (фактически GCC), чтобы поддерживать правильную обработку исключений.
Ну, его главная жалоба заключалась в том, почему std::type_info::name()
на самом деле вообще нужен для поддержки RTTI, и спросил, знаю ли я способ просто подавить генерацию строковых литералов, необходимых для поддержки этого, или, по крайней мере, сократить их.
станд:: type_info:: имя
const char* name() const;
Возвращает определенную реализацию строку символов с нулевым символом, содержащую имя типа. Даны гарантии, в частности, возвращаемая строка может быть одинаковой для нескольких типов и изменять между вызовами одной и той же программы.
A, - однако спецификатор компилятора -, реализация, например, оператор dynamic_cast<>
не использовал бы эту информацию, а скорее как хэш-тег для определения типа (аналогично для блоков catch()
с обработкой исключений).
Я думаю, что последнее ясно выражено существующими стандартными определениями для
Я должен был согласиться, что я также не вижу смысла использовать std::type_info::name()
, кроме как для целей отладки (ведения журнала). Я не был на 100% уверен, что обработка исключений будет работать без RTTI с текущими версиями GCC (я думаю, что они используют 4.9.1), поэтому я не решался рекомендовать просто отключить RTTI.
Кроме того, это случай, когда dynamic_casts<>
используются в их базе кода, но для них я просто не рекомендовал его использовать, в пользу static_cast
(у них на самом деле нет что-то вроде плагинов или требуется для обнаружения типа времени выполнения кроме утверждений).
Вопрос:
- Существуют ли случаи использования жизненного цикла производственного кода для
std::type_info::name()
, кроме ведения журнала?
Подзадачи (более конкретные):
-
Есть ли у кого-нибудь идея, как преодолеть (обойти) создание этих бесполезных строковых литералов (по предположению, что они никогда не будут использоваться)?
-
Действительно ли RTTI (по-прежнему) необходим для поддержки обработки исключений с помощью GCC?
(Эта часть хорошо решена теперь @Sehe answer, и я ее принял. Другой вопрос по-прежнему остается для оставшихся сгенерированных экземпляровstd::type_info
для любого исключения, используемые в коде. Мы уверены, что эти литералы нигде не используются)
Бит связанных: Разделите неиспользуемые исполняемые функции, которые разворачивают исполняемый файл (GCC)