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