exception - tipos - Modelos de manejo de excepciones de GCC
try catch definicion (2)
Evita sjlj. Cada bloque "try" llamará a setjmp, que guarda registros, un golpe de rendimiento incluso cuando no se generan excepciones. Usando tablas, el flujo normal de control no implica costo de ejecución. Solo cuando se produce una excepción, el mecanismo de manejo de excepciones tiene que arrastrarse por las tablas para descubrir qué hacer.
GCC es compatible con los modelos de manejo de excepciones Setjump-longjump (sjlj) y Dwarf2 basado en tablas (dw2). ¿Cuál es la diferencia entre los dos modelos y cómo elegir el modelo apropiado? ¿Por qué el enrutamiento basado en tablas Dwarf2 (dw2) es el modelo más eficiente? Entiendo que los dos modelos no se pueden mezclar.
Referencia: Technology Preview: gcc-4.2.1-sjlj -2
Bueno, dwarf2 construye tablas para cada función, que contienen lo que son los registros guardados en el lugar y en qué parte de la pila se guardan, y dónde está el puntero / dirección de devolución en la pila de llamadas, y algunas otras cosas. Si usa dwarf2, el compilador puede usar esa información y restaurar de manera efectiva los registros, y recurrir a las personas que llaman en el caso de una excepción. Los backends necesitan proporcionar información en el código de generación de prólogos de sus implementaciones, para decirle a GCC qué registros están guardados en el destinatario, y cuándo se guardó el puntero del marco y cosas por el estilo.
Usar setjmp / longjmp es solo un truco. Como setjmp / longjmp no conoce la estructura de la función de arrojar, restaurará todos los registros guardados en el búfer por setjmp, incluso si no fueron anulados por la función de lanzamiento. No soy realmente un experto en esto, pero creo que es obvio que esto no será eficiente. Además, cada vez que inicie un bloque de prueba, se debe llamar a setjmp para configurar el búfer que contiene los registros guardados, mientras que cuando se usa dwarf2, el compilador ya proporciona toda la información necesaria en tiempo de compilación.
Si los back-end no proporcionan la información necesaria, GCC automáticamente recurrirá a la gestión de excepciones basada en setjmp / longjmp.
Tenga en cuenta que no soy un experto en GCC. Acabo de portar la cadena de herramientas a un procesador sencillo de mi profesor, incluido GCC. Espero poder ayudarte un poco.