2010-11-02 9 views
25

llvm/clang se consideran buenas bases de código C++. Me pregunto por qué las excepciones de C++ no se usan en absoluto.No se usan excepciones de C++ por diseño, en llvm/clang

La memoria se gestiona utilizando algo así como agrupaciones, y los errores se informan con valores y códigos de retorno como en C. Incluso envuelven el operador nuevo para la ubicación nueva que devuelve error y no excepción cuando no hay memoria.

¿Tiene idea de por qué la filosofía de llvm no es usar excepciones de C++ cuando la mayoría de los libros recomiendan usarlas?

+1

Consulte la pregunta [¿Por qué no utiliza excepciones como flujo de control regular?] (Http://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control). Podría ser útil –

+0

¿Qué tiene que ver la RAII con las excepciones? – codymanix

+5

@Kirill: ¿cómo es relevante? No pregunto sobre excepciones de uso como control de flujo, sino utilícelas para lo que pretendían - erros – zaharpopov

Respuesta

18

Chris Lattner recientemente aclaró esta cuestión en el proyecto LLVM coding standards.

No se usan excepciones y RTTI reduce el tamaño del ejecutable y reduce la sobrecarga. (Podría argumentar que las excepciones de costo cero no tienen sobrecarga, a menos que se generen. Como mínimo, en realidad dividen el código en bloques básicos más pequeños e inhiben algunos tipos de movimiento de código.)

0

¿La mayoría de los libros recomiendan usarlos? Sé que la mayoría de los libros sobre programación en C++ los cubren porque son parte del lenguaje, pero no creo que haya visto un libro que dice preferirlos a códigos de error u otros métodos de manejo de errores. De hecho, diría que la mayoría de los libros implícitamente no recomiendan el uso de excepciones porque no cubren cómo escribir un buen código de excepción de seguridad.

En cuanto a que LLVM es un buen código y no es un código basado en excepciones, los dos conceptos son en gran parte ortogonales. El código puede escribirse con claridad o sin excepciones.

+4

más eficaz C++ recomienda preferir excepciones sobre códigos de retorno c porque no se pueden ignorar las excepciones – zaharpopov

+3

Lea "El lenguaje de programación C++" –

+9

Es cierto que la mayoría de los libros C++ no cubren la seguridad de excepciones. También es cierto que no vale la pena leer la mayoría de los libros en C++. Los pocos que vale la pena leer cubren la excepción de seguridad, ya que es de importancia crítica al escribir el código correcto de C++. –

0

Parece que no es una filosofía para evitar las excepciones. Al menos no encontré nada acerca de las excepciones en el estándar de codificación (http://llvm.org/docs/CodingStandards.html), por lo que depende del desarrollador.

¿Por qué no se usa ampliamente? El soporte de excepción AFAIK se implementó en llvm no muy lejos, por lo que no fue posible compilar llvm para llvm en sí mismo :). Entonces puede ser solo una razón histórica para evitar excepciones.

+1

filosofía o no, no hay absolutamente ninguna excepción utilizada en LLVM por lo que vi – zaharpopov

+1

tal vez simplemente no quieren? :) Puedes preguntar en la lista de correo de llvm – Yuras

6

Escribir una excepción segura El código de C++ es una tarea difícil.

Desactivando excepciones puede speed up code execution and reduce code size.

Tal vez esto está relacionado.

+10

Escribir el código de C++ correcto que no es también de excepción es mucho más difícil que escribir código de excepción de seguridad en primer lugar (al menos seguridad de excepción básica). –

+2

No puedo identificar ningún enlace específico, pero no usar excepciones de C++ es bastante común. La guía de estilo de Google C++ también menciona que las excepciones no se utilizan. Tal vez soy un poco pesimista, pero la seguridad de las excepciones básicas pronto puede no ser suficiente cuando se trata de excepciones. No es como si yo soy un defensor a favor o en contra de excepciones sin embargo ... – rotoglup

+12

@rotoglup: es cierto que la guía de estilo de Google C++ prohíbe excepciones, sino que también explica que no creía que esto era una buena decisión más, simplemente algo a lo que se vieron forzados por la necesidad de interoperar libremente con su propio código heredado. –

2

creo que esto se debe a otra pauta: Use assert liberally

  • condiciones de error normales se tratan usando códigos de error.
  • Las condiciones de error excepcional se tratan a través de assert.

Yo diría que un assert es una excepción aún más difícil: que definitivamente no se puede ignorar;)

+2

en el modo de lanzamiento puede :) – zaharpopov

+0

@zaharpopov: sí, pero significa que el software pasó todas las pruebas, y llvm/clang tiene un impresionante conjunto de pruebas creciendo a diario (y probado también a diario: p) –

5

Dependiendo de su compilador y su código, un programa que usa excepciones puede ser más rápido o más lento que un programa equivalente que deshabilita y no usa excepciones. Además, el que usa excepciones puede ser más grande o más pequeño.

Cada estrategia de manejo de errores incurre en algún costo, y espero que los desarrolladores de LLVM consideraran su situación y descubrieran que deshabilitar excepciones era la mejor decisión para LLVM.

Mi recomendación, y la recomendación que más he visto de los expertos, es usar excepciones para informar fallas a menos que tenga alguna razón sólida específica para no hacerlo. Si su razón es el rendimiento, sería conveniente basar su elección en el perfil. Recuerde que es vital comparar el código que usa excepciones para el código que no lo hace, pero aún maneja los errores correctamente.

+5

Los libros que tengo leer en el estilo C++ todos abogan por informar errores con excepciones. Esto incluye libros escritos por Herb Sutter, Andrei Alexandrescu y Bjarne Stroustrup. La biblioteca estándar recomienda implícitamente excepciones, en virtud de su uso para informar errores. En pocas palabras, las excepciones son los medios estándar establecidos para informar errores (aunque otros medios son perfectamente apropiados para algunos contextos). –

Cuestiones relacionadas