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

Не используя исключения С++ по дизайну, в llvm/clang

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

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

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

4b9b3361

Ответ 1

Недавно Крис Лэттнер разъяснил эту проблему в стандартах кодирования LLVM .

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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