Подтвердить что ты не робот

Какова фактическая цель std:: type_info:: name()?

Сегодня пришел мой коллега и задал мне вопрос, упомянутый в названии.
В настоящее время он пытается уменьшить двоичный код базы данных, который также используется для небольших целей (например, 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)

4b9b3361

Ответ 1

Изоляция этого бита:

  • Дело в том, что если они отключат RTTI, будет ли обработка исключений работать должным образом в GCC? - πάντα ῥεῖ 1 час назад

answer да:

-fno-rtti

Отключить генерацию информации о каждом классе с виртуальными функциями для использования функциями идентификации типа времени выполнения С++ (dynamic_cast и typeid). Если вы не используете эти части языка, вы можете сэкономить некоторое пространство, используя этот флаг. Обратите внимание, что обработка исключений использует ту же информацию, но она будет генерировать ее по мере необходимости. Оператор dynamic_cast все еще может использоваться для приведений, которые не требуют информации о типе времени выполнения, т.е. Отбрасываются до void * или к однозначным базовым классам.

Ответ 2

Существуют ли варианты использования уровня жизненного цикла производственного кода для std::type_info::name(), кроме журнала?

The Itanium ABI описывает, как operator== для объектов std::type_info можно легко реализовать с точки зрения тестирования строк, возвращенных из std::type_info::name() для равенство указателя.

В не-плоском адресном пространстве, где возможно иметь несколько объектов type_info для одного и того же типа (например, поскольку динамическая библиотека была загружена с помощью RTLD_LOCAL), для реализации operator== может потребоваться используйте strcmp, чтобы определить, совпадают ли два типа.

Таким образом, функция name() используется для определения того, относятся ли два объекта type_info к одному типу. Примеры реальных случаев использования, которые обычно используются, по крайней мере, в двух местах в стандартной библиотеке, в std::function<F>::target<T>() и std::get_deleter<D>(const std::shared_ptr<T>&).

Если вы не используете RTTI, то все, что не имеет значения, поскольку у вас не будет никаких объектов type_info в любом случае (и, следовательно, в libstdС++ функции function::target и get_deleter не могут использоваться).

Я думаю, что код обработки исключений GCC использует адреса самих объектов type_info, а не адреса строк, возвращаемых name(), поэтому, если вы используете исключения, но не RTTI, строки name() не нужны.