Как обработка исключений на основе таблиц лучше, чем в 32-разрядной версии Windows SEH? - PullRequest
0 голосов
/ 28 января 2019

В 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 стекового пространства, поэтому мы не получаем ничего, вытесняя эти данные в таблицы.)

...