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

Производительность, если исключения не выбрасываются (С++)

Я уже много читал о исключениях С++ и о том, что вижу, что особенно исключение - это трудная тема. Я даже пытался посмотреть под капотом g++, чтобы увидеть, как исключения представлены в сборке.

Я программист на C, потому что предпочитаю языки с низким уровнем. Некоторое время назад я решил использовать С++ над C, потому что при небольших затратах он может облегчить мою жизнь (классы по структурам, шаблонам и т.д.).

Возвращаясь к моему вопросу, я вижу, что исключения генерируют накладные расходы только тогда, когда они встречаются, так как для этого требуется длинная последовательность команд переходов и сравнений для поиска соответствующий обработчик исключений. При нормальном выполнении программы (где нет ошибок) служебные данные исключений равны нормальной проверке кода возврата. Я прав?

4b9b3361

Ответ 1

Пожалуйста, см. мой подробный ответ на аналогичный вопрос здесь.

Накладные расходы на обработку исключений зависят от платформы и зависят от ОС, компилятора и архитектуры процессора, в которой вы работаете.

Для Visual Studio, Windows и x86 существует стоимость, даже если исключения не выбрасываются. Компилятор генерирует дополнительный код, чтобы отслеживать текущую "область", которая позже используется для определения того, какие деструкторы должны вызывать и с чего начать поиск фильтров и обработчиков исключений. Изменения области запускаются блоками try и создаются объекты с деструкторами.

Для Visual Studio, Windows и x86-64 стоимость практически равна нулю, если исключения не выбрасываются. X86-64 ABI имеет гораздо более строгий протокол обработки исключений, чем x86, и ОС делает много тяжелой работы, поэтому самой программе не нужно отслеживать столько информации, чтобы обрабатывать исключения.

Когда происходят исключения, стоимость значительна, поэтому они должны произойти только в действительно исключительных случаях. Обработка исключений на x86-64 дороже, чем на x86, потому что архитектура оптимизирована для более распространенного случая исключений, которые не происходят.

Ответ 2

Здесь приведен подробный обзор стоимости обработки исключений, когда фактически не выбрасываются исключения:

http://www.nwcpp.org/old/Meetings/2006/10.html

В общем, в каждой функции, использующей обработку исключений (имеет либо try/catch блоки, либо автоматические объекты с деструктором) - компилятор генерирует дополнительный код пролога/эпилога для обработки записи регистрации expcetion.

Плюс после создания и уничтожения каждого автоматического объекта - добавляется еще несколько команд ассемблера (отрегулируйте регистрационную запись исключения).

Кроме того, некоторые оптимизации могут быть отключены. Особенно это касается случая, когда вы работаете в так называемой "асинхронной" модели обработки исключений.