2010-11-02 6 views
25

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

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

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

+1

Отметьте вопрос [Почему бы не использовать исключения в качестве регулярного потока управления?] (Http://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control). Это может быть полезно. –

+0

Что делает RAII с исключениями? – codymanix

+5

@ Kirill: как это уместно? я спрашиваю не об использовании исключений, как об управлении потоком, но использую их для того, что они намеревались - erros – zaharpopov

ответ

18

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

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

0

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

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

+4

более эффективный C++ рекомендует предпочесть исключения из c-подобных кодов возврата, поскольку исключения не могут быть проигнорированы – zaharpopov

+3

Чтение «Язык программирования C++» –

+9

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

0

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

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

+1

Философия или нет Есть абсолютно никаких исключений, используемых в LLVM, насколько я видел – zaharpopov

+1

Может быть, они просто не хотят? :) Вы можете запросить в списке рассылки llvm – Yuras

6

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

Выключение исключений может speed up code execution and reduce code size.

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

+10

Написание правильного кода на C++, который не является также безопасным для исключений, гораздо сложнее, чем просто писать код с исключительной безопасностью (по крайней мере, основную безопасность исключений). –

+2

Я не могу точно определить какую-либо конкретную ссылку, но не использовать исключения C++ довольно распространены. В руководстве по стилю Google C++ также упоминается, что исключения не используются. Может быть, я немного пессимистичен, но основная безопасность исключений может вскоре стать недостаточной при рассмотрении исключений. Не так, как если бы я был защитником или против исключений, хотя ... – rotoglup

+12

@rotoglup: это правда, что руководство по стилю Google C++ запрещает исключения, но также объясняет, что они не думали, что это было хорошее решение, просто то, к чему их принуждала необходимость свободно взаимодействовать со своим собственным устаревшим кодом. –

2

Я думаю, что это происходит из другого ориентира: Use assert liberally

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

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

+2

в режиме выпуска вы можете: – zaharpopov

+0

@zaharpopov: да, но это означает, что программное обеспечение прошло все тесты, а у llvm/clang есть впечатляющий набор тестов, ежедневно растущий: и ежедневно тестируется: p) –

5

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

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

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

+5

Книги, которые я имею прочитайте на C++-стиле все сообщения об ошибках, сообщающие об ошибках с исключениями. Сюда входят книги, написанные Хербом Саттер, Андреем Александреску и Бьярне Страуступом. Стандартная библиотека неявно рекомендует исключения, в силу их использования для сообщения об ошибках. Проще говоря, исключения являются установленными стандартными средствами сообщения об ошибках (хотя другие средства идеально подходят для некоторых контекстов). –

 Смежные вопросы

  • Нет связанных вопросов^_^