Эффективно ли Throwing Exception для принудительного выхода из рекурсии?

Поскольку вы смещаете бит int на 32 бита; вы получите: warning C4293: '<<' : shift count negative or too big, undefined behavior в VS. Это означает, что вы смещаетесь за пределы целого числа, и ответ может быть НИЧЕГО, потому что это неопределенное поведение.

4
задан sapy 30 March 2019 в 23:43
поделиться

1 ответ

Я бы не рекомендовал создавать исключения для разрыва цепочки рекурсии по нескольким причинам.

  • Эффективность . Вызов исключения, вообще говоря, намного медленнее, чем возврат из функции. В частности, когда выдается исключение, среда выполнения должна заполнить исключение текущей трассировкой стека, должна посмотреть, какой обработчик вызывать, должна выполнить поиск блоков finally или операторов try -with-resources отслеживание ссылок на объекты для целей сборки мусора и т. д. Это все еще требует обхода стека вызовов, так же, как при возврате значения в цепочку вызовов, и это почти наверняка не будет быстрее, чем при более стандартном подходе. [1110 ]

  • Удобство . Если вы генерируете исключение для прерывания рекурсивной цепочки, то всякий, кто вызывает вашу функцию, должен написать код, который реагирует на это исключение. Это означает, что вместо того, чтобы что-то наподобие написания if (myCall()) {...}, им нужно иметь отдельные ветви: одну для того, где вызов возвращает значение нормально, а другую для случая, когда он выбрасывает. Если они забудут это сделать, код во время выполнения может показаться сбойным из-за исключения, когда на самом деле он ведет себя так, как ожидалось. Хуже того, вы на самом деле изменили бы обычное использование исключений. Если ваш код выдает исключение, когда он завершается успешно и возвращает значение, когда он завершается с ошибкой , то, кто бы ни читал ваш код, вероятно, пойдет "да?" по крайней мере, один раз, прежде чем выяснить, что вы имели в виду.

  • Четкость . Исключения должны использоваться для ситуаций, которые, ну, в общем, исключительные! Механизм исключения разработан для того, чтобы сообщать информацию в тех случаях, когда просто невозможно найти способ вернуть значение. Использование системы исключений для обработки регулярного потока управления затрудняет чтение и сопровождение кода и нарушает принцип наименьшего сюрприза.

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

0
ответ дан templatetypedef 30 March 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: