Как отключить обработку исключений?

В книге More Effective С++ (Number 15) я прочитал, что код становится значительно медленнее, если исключения включены, даже если они не используются. На мой взгляд, исключения имеют ограниченное применение, и я стараюсь их избегать, но это еще одна тема.

Я не совсем понимаю его утверждение:

  • Что означает включение/отключение исключений? Это разница между наличием нуля или более нуля блоков try/catch? Это флаг компилятора? Что произойдет, если я использую DLL, в которой могут произойти исключения?
  • Предположим, что исключение никогда не вызывается:
    • Оказывает ли код более медленный в целом или только части, в которые программа входит/выходит из блоков try/catch, замедляется? По словам автора, оба они верны.
  • Как я могу скомпилировать без исключений? Могу ли я это сделать, даже если у меня есть блоки try/catch? Могу ли я это сделать, если DLL, которые я использую, может генерировать исключения?

Ответ 1

Что означает включение/отключение исключений?

Передача флага компилятору, который отключает стандартное соответствие по отношению к исключениям и не создает никакой поддержки исключений.

Что произойдет, если я использую DLL, в которой могут произойти исключения?

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

Становится ли код более медленным в целом или только те части, где программа входит/выходит из блоков try/catch, становится медленнее? По словам автора, оба они верны.

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

Как я могу скомпилировать без исключений? Могу ли я это сделать, даже если у меня есть блоки try/catch?

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