2009-08-25 20 views
33

Mentalmente, siempre me he preguntado cómo se ve/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).C++ try/throw/catch => código de máquina

¿La pila normal se utiliza para realizar el seguimiento de try s, 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! :)

Edit: Ahora obtengo los principios 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?

Respuesta

7

Microsoft Diario de "bajo el capó", la serie ha hecho un vistazo en profundidad a ese mismo tema en 1997:

A Crash Course on the Depths of Win32™ Structured Exception Handling

+0

Eso cubre el Manejo de excepciones estructurado de Windows, que está relacionado con, pero no es lo mismo que, el manejo de excepciones de C++.Pietrek menciona en la introducción que las excepciones de C++, tal como lo implementaron Microsoft y Borland, usan SEH, pero que su artículo no cubre * cómo * lo implementan. –

+0

Gran artículo de MSVC/IA-32, aunque extenso. –

+1

Las excepciones de C++ son solo una clase de excepciones SEH, con un contenedor para incluir la información de C++ (la instancia de la clase de excepción). Las excepciones de C++ tienen que usar SEH para que propaguen los límites del kernel, etc. –

15

Este es un artículo muy valiosa sobre el tema: How a C++ compiler implements exception handling

+1

Este artículo se ha publicado en 2002 ... ¿está realmente actualizado? – Klaim

+0

Tomé una descripción hace mucho tiempo. No estoy muy seguro de si está actualizado. – AraK

+13

2002 es bastante reciente según los estándares de C++ – Javier

0

Tenga una mirada en this document que describe el funcionamiento interno de manejo bastante bien la excepción.

18

implementaciones Pobres de controladores de excepciones empujan algún tipo de bloqueo gestor de excepciones para cada uno de tratar cláusula en la pila de tiempo de ejecución cuando se ingresa la cláusula try, y estalló 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 implementaciones buenas 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 software de programación paralela utiliza 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 Windows 64 bit EH es de este tipo, pero no he mirado con cuidado.

3

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".

Cuestiones relacionadas