w64 setup portable instalar compiler como c++ compiler-construction mingw cpu-architecture mingw-w64

c++ - setup - ¿Cuál es la diferencia entre sjlj vs dwarf vs seh?



mingw portable (2)

No puedo encontrar suficiente información para decidir qué compilador debería usar para compilar mi proyecto. Hay varios programas en diferentes computadoras que simulan un proceso. En Linux, estoy usando GCC. Todo esta bien. Puedo optimizar el código, se compila rápido y no usa tanta memoria.

Hago mi propio benchmark con compiladores MSVC y GCC. Más tarde, uno produce binarios ligeramente más rápidos (para cada subarquitectura). Aunque el tiempo de compilación es mucho más que MSVC.

Entonces decidí usar MinGW. Pero no puede encontrar ninguna explicación sobre los métodos de manejo de excepciones y sus implementaciones en MinGW. Puedo usar diferentes distribuciones para diferentes sistemas operativos y arquitecturas.

Consideraciones:

  • El tiempo de compilación y la memoria no son importantes para mi uso. Lo único importante es la optimización del tiempo de ejecución. Necesito que mis programas sean lo suficientemente rápidos. Un compilador lento es aceptable.
  • Sistema operativo: Microsoft Windows XP / 7/8 / Linux
  • Arquitectura: Intel Core i7 / Core2 / y un muy viejo i686 ejecutando XP: P

SJLJ (setjmp / longjmp): - disponible para 32 bits y 64 bits - no es "cero costo": incluso si no se lanza una excepción, incurre en una penalización de rendimiento menor (~ 15% en código pesado de excepción) - permite excepciones para atravesar, por ejemplo, llamadas de Windows

DWARF (DW2, dwarf-2): disponible solo para 32 bits, sin sobrecarga de tiempo de ejecución permanente, necesita que toda la pila de llamadas esté activada enano, lo que significa que no se pueden lanzar excepciones, por ejemplo, las DLL del sistema de Windows.

SEH (excepción de gastos generales cero): estará disponible para GCC 4.8 de 64 bits.

fuente: http://qt-project.org/wiki/MinGW-64-bit


Hay una breve descripción en MinGW-w64 Wiki :

¿Por qué mingw-w64 gcc no admite Dwarf-2 Exception Handling?

La implementación Dwarf-2 EH para Windows no está diseñada para funcionar bajo aplicaciones Windows de 64 bits. En el modo win32, el manejador de desenrollo de excepción no se puede propagar a través de un código no compatible con dw2, esto significa que cualquier excepción que pase por un código de "marcos extraños" que no sean de dw2 fallará, incluidos los DLL del sistema de Windows y las DLL creadas con Visual Studio. El código de desenredo Dwarf-2 en gcc inspecciona el conjunto de desenrollado x86 y no puede continuar sin otra información de desenrollado enano-2.

El método SetJump LongJump de manejo de excepciones funciona para la mayoría de los casos en win32 y win64, a excepción de las fallas de protección general. El soporte de manejo de excepciones estructuradas en gcc se está desarrollando para superar las debilidades de dw2 y sjlj. En win64, la información de desenrollado se coloca en la sección xdata y está la .pdata (tabla de descriptores de funciones) en lugar de la pila. Para win32, la cadena de manejadores está en la pila y necesita ser salvada / restaurada por código ejecutado real.

GCC GNU sobre manejo de excepciones :

GCC admite dos métodos para el manejo de excepciones (EH):

  • DWARF-2 (DW2) EH , que requiere el uso de información de depuración DWARF-2 (o DWARF-3). DW-2 EH puede provocar que los ejecutables se vean ligeramente inflados debido a que se deben incluir grandes tablas de desenrollado de pila en los ejecutables.
  • Un método basado en setjmp / longjmp (SJLJ) . SJLJ basado en EH es mucho más lento que DW2 EH (penalizando incluso la ejecución normal cuando no se lanzan excepciones), pero puede funcionar a través del código que no se ha compilado con GCC o que no tiene información de desenrollado de la pila de llamadas.

[...]

Manejo estructurado de excepciones (SEH)

Windows usa su propio mecanismo de manejo de excepciones conocido como Manejo estructurado de excepciones (SEH). [...] Desafortunadamente, GCC aún no es compatible con SEH. [...]

Ver también: