Cuando usa/EHsc, el compilador solo emitirá código para filtros de excepción cuando puede detectar que el código envuelto en el bloque try {} podría lanzar una excepción C++. Un filtro de excepción asegura que el destructor de cualquier objeto local de C++ se llame cuando la pila se desenrolla mientras se maneja una excepción. Hace que RAII funcione.
Eso es una optimización, espacio y tiempo para el código x86, espacio para el código x64. Espacio porque puede omitir el código de filtro de excepción, que es modesto por cierto. Tiempo porque en x86 puede evitar registrar el filtro de excepción al ingresar al bloque try {}. Muy modesto por cierto. x64 usa una forma diferente de encontrar filtros de excepción, está basado en tablas.
La frase clave en el primer párrafo es "podría arrojar una excepción de C++". En Windows existen otras fuentes de excepciones. Al igual que la "a" en/EHa, excepciones asincrónicas que plantea el hardware. Cosas como excepciones de punto flotante, división por cero y la excepción de violación de acceso omnipotente. Pero también notablemente el tipo de excepciones que surgen por código con el que puede interoperar. Al igual que el código administrado, básicamente todo lo que se ejecuta en una máquina virtual.
Cuando desee hacer que sus objetos sean seguros para estas excepciones también necesitará usar/EHa, que le dice al compilador siempre registrar el filtro de excepción.
Tenga cuidado con un desagradable efecto secundario de/EHa, hace que capture (...) trague todas las excepciones. Incluyendo los que nunca debes atrapar, como AV y SO. Mire __try/__except
y _set_se_translator() si eso es importante para usted.
+1 Ah, no sabía las diferencias entre x86 y x64. ¿Podría recomendar amablemente alguna referencia sobre la programación x64? Algo así como "10 minutos de introducción a la programación x64 para el programador x86" :) – 9dan