try tipo son que programas programar personalizada las instrucciones hacer funciones excepciones excepcion ejemplos como codigos catch c++ exception-handling g++ exit

son - tipo de excepciones en c++



Deshabilitando las excepciones de C++, ¿cómo puedo hacer que std:: throw() termine inmediatamente? (5)

Este programa en C ++ es un script CGI, no tengo ningún deseo de tratar con excepciones. Prefiero obtener un aumento de rendimiento marginal y dejar que el sistema operativo (Linux) se encargue de la limpieza después de que el proceso finalice.

Estoy usando la biblioteca estándar de C ++, y quiero que cualquier función die como en Perl: cada vez que lanza una excepción. Sin desenrollar, ni ejecutar ningún otro código en mi proceso.

¿Cómo funciona -fno-excepciones? Si no tengo ningún problema en mi código, y básicamente pretendo que las excepciones no existen. pero uso la biblioteca std :: c ++ que puede lanzar ()?


Citar:

Este programa en C ++ es un script CGI, no tengo ningún deseo de tratar con excepciones.

  • Entonces no lo hagas Sencillo. La excepción llegará a la parte superior de la pila muy rápidamente.

Pero le insto a que lo haga. Hacer eso significa que estás pensando en las cosas que pueden salir mal.


En caso de que alguien se tope con esta pregunta, me gustaría corregir qué @GManNickG y ( https://.com/a/7249460/157344 ) y @bdonlan ( https://.com/a/7249442/157344 ) Dijo en sus respuestas. Desafortunadamente, la parte sobre "-fno-excepción" eliminando todo el código de manejo de excepciones y convirtiendo todos los tiros en abortos es incorrecta. Bueno, parcialmente mal. Esto es cierto cuando compila la biblioteca en cuestión (libstdc ++ v3) con este indicador, pero no es cierto si usa esta biblioteca (como .a o .so o .dll o lo que sea) en su propio código compilado con este indicador . En este último caso, el código de manejo de excepciones en SU ​​código está prohibido, pero todas las llamadas al manejo de excepciones dentro de la biblioteca permanecen (porque la biblioteca se compiló SIN este indicador, con las excepciones habilitadas), por lo tanto, si usa un new , su ejecutable código de manejo de excepciones: la única diferencia es que no puede hacer nada sobre estas excepciones con un catch() (que está prohibido en su código), por lo que todos los lanzamientos terminan efectivamente como abort() , pero solo porque nadie los atrapa.


Opción # 1: Simplemente nunca atrapar excepciones.

Las excepciones no tienen mucha sobrecarga cuando no son lanzadas o atrapadas; Si estás lanzando y no estás preparado para atrapar, bueno, estás haciendo morir de todos modos, por lo que el impacto en el rendimiento en ese momento es trivial. Tenga en cuenta también que el desenrollado de la pila no se realizará si no se maneja una excepción; el programa simplemente terminará sin realizar el desenrollado de la pila.

Es importante tener en cuenta que, en G ++, las excepciones casi no tienen gastos generales cuando no se lanzan realmente. G ++ genera información adicional suficiente para rastrear la ejecución del programa a través de la pila, y algo de código adicional para invocar a los destructores, etc. Sin embargo, ninguno de este código o datos adicionales se usa hasta que se lanza una excepción. Por lo tanto, no debería ver una diferencia de rendimiento entre el código con las excepciones habilitadas pero no utilizadas y el código con las excepciones inhabilitadas (a través de cualquier mecanismo).

Opción # 2: Pase -fno-exceptions .

Esta bandera le indica a G ++ que haga dos cosas :

  1. Se eliminan todos los controles de excepciones en las bibliotecas STL; los lanzamientos son reemplazados por abort() llamadas
  2. Pila de datos de desenrollado y el código se elimina. Esto ahorra algo de espacio de código y puede hacer que la asignación de registros sea un poco más fácil para el compilador (pero dudo que tenga mucho impacto en el rendimiento). Sin embargo, notablemente, si se lanza una excepción, y la biblioteca intenta desenrollar a través -fno-exceptions código -fno-exceptions , -fno-exceptions en ese punto, ya que no hay datos de desenrollado.

Esto, efectivamente, convertirá todas las excepciones en abort() s, como le gustaría. Sin embargo, tenga en cuenta que no se le permitirá throw , ya que cualquier throw o catch real en su código resultará en un error de compilación.

Opción # 3: (¡No portátil y no recomendado!) Enganche __cxa_allocate_exception.

Las excepciones de C ++ se implementan utilizando (entre otras) las funciones de la biblioteca interna __cxa_allocate_exception y __cxa_throw. Puede implementar una biblioteca LD_PRELOAD que enlaza estas funciones para abortar ():

void __cxa_allocate_exception() { abort(); } void __cxa_throw() { abort(); }

ADVERTENCIA: Este es un hack horrible. Debería funcionar en x86 y x86-64, pero recomiendo encarecidamente esto. En particular, en realidad no mejorará el rendimiento ni ahorrará espacio de código, como podría hacer -fno-exceptions . Sin embargo, permitirá la sintaxis del throw , mientras que convierte los throw en abort() s.


Simplemente no los atrapes en ninguna parte de tu código. En ese caso, se llamará a un controlador de terminación y su programa se "bloqueará".