Ответ только на обновление:
Действительно ли для обработки исключений требуется включение RTTI
Для обработки исключений на самом деле требуется нечто более мощное, чем RTTI и динамическое приведениеодно уважение.Рассмотрим следующий код:
try {
some_function_in_another_TU();
} catch (const int &i) {
} catch (const std::logic_error &e) {}
Итак, когда функция в другом TU сгенерирует, она будет искать стек (либо сразу проверять все уровни, либо проверять один уровень за раз во время разматывания стека,это до реализации) для предложения catch, которое соответствует выбрасываемому объекту.
Для выполнения этого соответствия может не потребоваться аспект RTTI, который хранит тип в каждом объекте, так как тип брошенногоИсключением является статический тип выражения броска.Но ему нужно сравнивать типы instanceof
и делать это во время выполнения, потому что some_function_in_another_TU
можно вызывать откуда угодно, с любым типом перехвата в стеке.В отличие от dynamic_cast
, он должен выполнять эту проверку экземпляра во время выполнения для типов, которые не имеют виртуальных функций-членов, и в этом случае для типов, которые не являются типами классов.Последняя часть не добавляет трудностей, потому что не относящиеся к классам типы не имеют иерархии, и поэтому все, что нужно, это равенство типов, но вам все равно нужны идентификаторы типов, которые можно сравнивать во время выполнения.
Итак, если выВключите исключения, тогда вам нужна часть RTTI, которая выполняет сравнения типов, например, dynamic_cast
, но охватывает больше типов.Вам не обязательно нужна та часть RTTI, которая хранит данные, используемые для выполнения этого сравнения, в vtable каждого класса, где она достижима из объекта - вместо этого данные можно кодировать только в точке каждого выражения throw и каждого предложения catch,Но я сомневаюсь, что это значительная экономия, поскольку typeid
объекты не совсем массивны, они содержат имя, которое в любом случае часто требуется в таблице символов, а также некоторые данные, определенные реализацией для описания иерархии типов.Так что, вероятно, к этому моменту вы могли бы иметь все RTTI.