Джерри сказал: ... результат не совсем C ++ больше , в то время как моя метафора является то , что она является явно C ++, просто немного другой диалект , так как программы используют другие формы, соглашение и письменные стили.
Вот мои основные причины их отключения:
Двоичная совместимость
Пересечение языка и границ перевода не всегда четко определены или не определены. Если вы хотите гарантировать, что ваша программа работает в домене определенного поведения, вам нужно будет помещать в карантин исключения в точках выхода модуля.
Размер исполняемого файла
Вот бинарные размеры написанной мной бесплатной программы без исключений:
Без исключений:
- исполняемый файл + зависимости: 330
- окончательно очищенный исполняемый файл (сборка выпуска): 37
За исключением:
- исполняемый файл + зависимости: 380
- окончательно очищенный исполняемый файл (сборка выпуска): 44
Напоминание: это коллекция библиотек и программ, которые содержат ноль бросков / уловов. Флаг компилятора делает включить исключения в стандартной библиотеке C ++. Таким образом, стоимость в реальном мире составляет более 19% в этом примере.
Компилятор: яблоко gcc4.2 + llvm. Размеры в МБ.
скорость
Несмотря на термин «исключения с нулевой стоимостью», они все еще добавляют некоторые накладные расходы, даже когда ничего не выбрасывается. В приведенном выше случае это программа, критичная к производительности (обработка сигналов, генерация, представление, преобразования, с большими наборами данных / сигналами и т. Д.). Исключения не являются обязательной функцией в этом проекте, в то время как производительность очень важна.
Корректность программы
Похоже на странную причину ... Если выбрасывание не вариант, вы должны написать относительно строгие, правильные, хорошо протестированные программы, чтобы гарантировать, что ваша программа работает правильно, и что клиенты используют интерфейсы правильно (если вы даете мне неверный аргумент или делаете Не проверяйте код ошибки, тогда вы заслуживаете UB). Результат? Качество реализации значительно улучшается, и проблемы быстро решаются.
Простота
Реализации обработки исключений не часто обновляются. Они также добавляют большую сложность, потому что реализация может иметь много много выходных последовательностей. Проще читать и поддерживать очень сложные программы, когда они используют небольшой набор четко определенных, типизированных стратегий выхода, которые вырабатываются клиентом и обрабатываются им. В других случаях реализации могут со временем реализовывать больше бросков, либо их зависимости могут вводить их. Клиенты не могут легко или надлежащим образом защитить от всех этих выходов. Я пишу и обновляю много библиотек, часто происходит развитие и улучшение. Попытка сохранить это в синхронизации с выходными последовательностями исключений (в большой кодовой базе) не будет хорошим расходом времени и, вероятно, добавит много шума и бесполезности. Из-за повышенной корректности программы и большего количества тестов,
История / Существующий Код
В некоторых случаях они никогда не были введены по историческим причинам. Существующая кодовая база не использовала их, изменение программ может занять человеко-годы и сделать его действительно уродливым из-за совпадения в соглашениях и реализациях.
Downsides
Конечно, есть и недостатки, самые большие из них: несовместимость (в том числе бинарная) с другими библиотеками, а также тот факт, что вам придется реализовать большое количество программ для этой модели.