c++ - son - try catch++
C++ try/throw/catch=> código máquina (5)
Eche un vistazo a este documento que describe bastante bien los aspectos internos del manejo de excepciones.
Mentalmente, siempre me he preguntado cómo se ve try / throw / catch detrás de escena, cuando las compilaciones de C ++ lo traducen al ensamblador. Pero como nunca lo uso, nunca llegué a verificarlo (algunas personas dirían perezoso).
¿Se usa la pila normal para realizar un seguimiento de las try
, o se mantiene una pila por hilo separada solo para este propósito? ¿La implementación entre MSVC y g ++ es grande o pequeña? Por favor muéstrame un pseudo asm (el IA-32 también está bien) ¡así que nunca tengo que verificarlo yo mismo! :)
Editar: ahora obtengo los conceptos básicos de la implementación de MSVC en el manejo IA-32. ¿Alguien sabe por g ++ en IA-32, o cualquier otra CPU para el caso?
El comité estándar de C ++ publicó un informe técnico sobre el "rendimiento de C ++" para desacreditar muchos mitos acerca de cómo las características de C ++ supuestamente lo hacen más lento. Esto también incluye detalles sobre cómo se podría implementar el manejo de excepciones. El draft de este informe técnico está disponible de forma gratuita. Ver sección 5.4.1. "Problemas y técnicas de implementación de manejo de excepciones".
Este es un artículo muy valioso sobre el tema: Cómo un compilador de C ++ implementa el manejo de excepciones
La serie "Under the Hood" de Microsoft Journal hizo un análisis en profundidad de ese tema en 1997:
Un curso acelerado sobre las profundidades del manejo estructurado de excepciones de Win32 ™
Las implementaciones deficientes de manejadores de excepciones insertan algún tipo de bloque de manejador de excepciones para cada cláusula de prueba en la pila de ejecución cuando se ingresa la cláusula try, y la abren cuando se cierra la cláusula try. También se mantiene una ubicación que contiene la dirección del bloque controlador de excepciones más recientemente utilizado. Normalmente, estos manejadores de excepciones están encadenados para poder encontrarlos siguiendo los enlaces de las versiones más recientes a las más antiguas. Cuando se produce una excepción, se encuentra un puntero al último bloque de controlador EH, y se comprueba el procesamiento de los casos EH de esa cláusula "try". Un golpe en un caso de EH hace que la limpieza de la pila vuelva a ocurrir hasta el punto de EH empujado, y las transferencias de control al caso de EH. Sin hits en el EH hace que se encuentre el siguiente EH, y el proceso se repite. El esquema de Windows SEH de 32 bits es una versión de esto.
Esta es una implementación deficiente porque el programa paga un precio de tiempo de ejecución para cada cláusula try (presionar y luego hacer pop) incluso cuando no se produce una excepción.
Las buenas implementaciones simplemente registran una tabla de rangos donde ocurren las cláusulas try. Esto significa que no hay gastos generales para ingresar / salir de una cláusula try. (Mi PARLANSE paralelo de programación PARLANSE usa esta técnica). Una excepción busca en la PC el punto de excepción en la tabla, y pasa el control al EH seleccionado por la tabla. El código EH restablece la pila según corresponda. Rápido y bonito Creo que el Windows EH de 64 bits es de este tipo, pero no he mirado con cuidado.