Не использует исключения C ++ по дизайну, в llvm / clang - PullRequest
26 голосов
/ 02 ноября 2010

llvm / clang считаются хорошими базами кода C ++. Интересно, почему исключения C ++ в них вообще не используются?

Управление памятью осуществляется с помощью чего-то вроде пулов, и об ошибках сообщается со значениями и кодами возврата, как в C. Они даже переносят оператор new на новое место размещения, которое возвращает ошибку, а не исключение при отсутствии памяти.

У вас есть идея, почему философия llvm не использует исключения C ++, когда большинство книг рекомендует их использовать?

Ответы [ 6 ]

18 голосов
/ 01 декабря 2010

Крис Латтнер недавно прояснил этот вопрос в проекте LLVM стандарты кодирования .

Не использует исключения, а RTTI уменьшает размер исполняемого файла и уменьшает накладные расходы. (Вы можете утверждать, что исключения с нулевой стоимостью не имеют служебных данных, если только их не выбросили. Как минимум, они фактически разбивают код на более мелкие базовые блоки и блокируют некоторые типы движения кода.)

6 голосов
/ 03 ноября 2010

Написание безопасного кода для исключений c ++ - сложная задача.

Отключение исключений может ускорить выполнение кода и уменьшить размер кода .

Возможно это связано.

5 голосов
/ 12 июня 2012

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

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

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

2 голосов
/ 04 ноября 2010

Я думаю, что это вытекает из другого руководства: Использовать подтверждение всесторонне

  • Нормальные условия ошибки обрабатываются с использованием кодов ошибок.
  • Исключительные условия ошибки обрабатываются с помощьюassert.

Я бы сказал, что assert - еще более сложное исключение: вы определенно не можете его игнорировать;)

0 голосов
/ 02 ноября 2010

Кажется, это не философия llvm - избегать исключений.По крайней мере, я ничего не нашел об исключениях в стандарте кодирования (http://llvm.org/docs/CodingStandards.html),, поэтому дело за разработчиком.

Почему оно не используется широко?можно скомпилировать llvm для llvm самому :).Так что это может быть просто историческая причина, чтобы избежать исключений.

0 голосов
/ 02 ноября 2010

Большинство книг рекомендует их использовать?Я знаю, что большинство книг по программированию на C ++ охватывают их, потому что они являются частью языка, но я не думаю, что видел книгу, в которой говорится, что они предпочитают их кодам ошибок или другим методам обработки ошибок.Фактически, я бы сказал, что большинство книг неявно не рекомендуют использовать исключения, потому что они не описывают, как писать хороший безопасный код для исключений.

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

...