В 32-битной Windows (по крайней мере, с компиляторами Microsoft) обработка исключений реализуется с использованием стека фреймов исключений, динамически выделяемых в стеке вызовов; на вершину стека исключений указывает запись TIB. Стоимость выполнения — это пара инструкций PUSH/POP на функцию, которая должна обрабатывать исключения, перенос переменных, к которым обращается обработчик исключений, в стек, а при обработке исключения — простой обход по связному списку.
И в 64-битная Windows, и в Itanium / System V x86-64 ABI раскручивание вместо этого использует большой отсортированный список, описывающий все функции в памяти. Стоимость выполнения — это несколько таблиц на функцию каждый (а не только те, которые участвуют в обработке исключений), осложнения для динамически сгенерированного кода и при обработке исключения обход списка функций один раз для каждой активной функции несмотря ни на что, связанной ли она с исключениями. или нет.
Чем последний лучше первого? Я понимаю, почему модель Itanium в общем случае дешевле, чем традиционная модель UNIX, основанная на setjmp/longjmp, но пара PUSH и POP плюс некоторая утечка регистров в 32-битной Windows не кажутся такими уж плохими, поскольку (на первый взгляд) гораздо более быстрое и простое обращение, которое он обеспечивает. (IIRC, вызовы Windows API в любом случае обычно потребляют Ks пространства стека, поэтому мы не получаем ничего, вытесняя эти данные в таблицы.)





В дополнение к оптимизации счастливого случая, возможно, также имелось опасение, что уязвимости переполнения буфера могут раскрыть информацию в исключении. Если эта информация будет повреждена, это может серьезно запутать пользователя или даже вызвать дальнейшие ошибки (помните, что std::terminate() вызывается, если возникает другое исключение).
Источник: http://www.osronline.com/article.cfm%5earticle=469.htm