No usar excepciones de C++ por diseño, en llvm / clang


Llvm/clang se consideran buenas bases de código C++. Me pregunto por qué las excepciones de C++ no se usan en absoluto.

La memoria se administra usando algo como pools, y los errores se reportan con valores y códigos de retorno como en C. Incluso empaquetan el operador new para ser colocado new 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?

Author: zaharpopov, 2010-11-02

6 answers

Chris Lattner aclaró recientemente este problema en el proyecto LLVM coding standards.

No usar excepciones y RTTI reduce el tamaño del ejecutable y reduce la sobrecarga. (Podría argumentar que las excepciones de costo cero no tienen gastos generales a menos que se produzcan. 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.)

 18
Author: ohmantics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-01 18:33:47

Escribir código c++ seguro para excepciones es una tarea difícil.

Desactivar las excepciones puede acelerar la ejecución del código y reducir el tamaño del código.

Tal vez esto está relacionado.

 6
Author: rotoglup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-02 21:48:23

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. También el que usa excepciones puede ser más grande o más pequeño.

Cada estrategia de manejo de errores conlleva algún costo, y espero que los desarrolladores de LLVM consideraran su situación y descubrieran que deshabilitar las 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 reportar fallas a menos que tenga alguna razón específica y sólida para no hacerlo. Si su razón es el rendimiento, sería prudente basar su elección en el perfil. Recuerde que es vital comparar el código que usa excepciones con el código que no lo hace, pero aún maneja los errores correctamente.

 5
Author: Todd Greer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-12 19:41:17

Creo que esto se deriva de otra directriz: Use assert liberally

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

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

 2
Author: Matthieu M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-04 15:57:30

¿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 haber visto un libro que diga que los prefiera a los 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 seguro de excepciones.

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 medida ortogonal. El código se puede escribir limpiamente con o sin excepciones.

 0
Author: stonemetal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-02 18:35:22

Parece que no es una filosofía de llvm evitar excepciones. Al menos no encontré nada sobre 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? AFAIK exception support no se implementó en llvm hasta ahora, por lo que no fue posible compilar llvm para llvm en sí :). Así que puede ser solo una razón histórica para evitar excepciones.

 0
Author: Yuras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-02 18:46:10