Ответ 1
"Являются ли компиляторы достаточно умными", похоже, намекает, что Исключения не служат цели в вашем проекте, и, если это произойдет, вы не должны использовать их в первую очередь (если, конечно, у вас нет возможности получение исключения).
Краткий ответ: Нет, компиляторы не будут удалять ваши исключения/обработку исключений на основе шаблона, который вы используете.
Когда вы используете try/catch, исключение, которое он обрабатывает, добавляется в основную таблицу исключений; эту таблицу можно контролировать, подключать, добавлять и удалять. Просто потому, что вы поймаете исключение сразу же, это не значит, что с ним ничего не происходит.
Боковой источник:
Бумага была написана на Optimizing Away C++ Exception Handling
, которая описывает все (почти все) текущие реализации оптимизаций, относящихся к исключениям. Во всем этом он показывает, что в настоящее время они не удаляются во время компиляции, но для них делается оптимизация. Сам документ рекомендует усовершенствования EH (обработка исключений) для удаления ненужных исключений и, в целом, довольно хорошее чтение.
ОБНОВЛЕНИЕ (дополнительные источники)
Глядя далее в эту тему, компилятор GCC, похоже, не оптимизирует исключения; однако он предлагает такую возможность: -fno-exceptions
. Эта опция удалит все исключения и сразу заменит их вызовами abort()
.
В другом источнике (fooobar.com/questions/320250/...) прямо не упоминается "удаление исключений", но описываются две оптимизации, сделанные для исключений, setjmp/longjmp
и нулевая стоимость, Это можно сделать путем выделения фактических улучшений без упоминания "полного удаления исключения", что такой оптимизации нет (хотя, по крайней мере, с упомянутыми компиляторами). Другой источник с более подробной информацией об этих оптимизациях можно найти здесь.