Ответ 1
Журнал Microsoft "Under the Hood" сделал подробный обзор этого самого предмета еще в 1997 году:
Краш-курс по глубинам обработки структурированных исключений Win32 ™
Ментально, я всегда задавался вопросом, как try/throw/catch выглядит за кулисами, когда компиляция С++ переводит его на ассемблер. Но, так как я никогда не использую его, я никогда не стал проверять его (некоторые люди говорили бы лениво).
Является ли обычный стек использован для отслеживания try
s или является отдельным стеком для каждой нити, предназначенным для этой цели? Является ли реализация между MSVC и g++ большой или малой? Пожалуйста, покажите мне какой-то псевдо-asm (IA-32 тоже в порядке), поэтому мне никогда не придется проверять это сам!:)
Изменить: Теперь я получаю основы реализации MSVC при обработке IA-32. Кто-нибудь знает о g++ на IA-32 или какой-либо другой CPU, если на то пошло?
Журнал Microsoft "Under the Hood" сделал подробный обзор этого самого предмета еще в 1997 году:
Краш-курс по глубинам обработки структурированных исключений Win32 ™
Плохие реализации обработчиков исключений нажимают какой-то блок обработчика исключений для каждого предложения try в стеке выполнения при вводе предложения try и выталкивают его, когда условие try выдается. Также поддерживается местоположение, содержащее адрес самого последнего заблокированного блока обработчика исключений. Обычно эти обработчики исключений связаны друг с другом, поэтому их можно найти по ссылкам из последней и более старой версий. Когда возникает исключение, обнаруживается указатель на последний обработанный блок EH-обработчика, и проверяется проверка этого случая "try" EH. Удар по EH-случаю заставляет очистку стека вернуться к точке нажатой EH и контролировать передачу в случай EH. Никакие удары по EH не приводят к обнаружению следующего EH, и процесс повторяется. 32-битная схема SEH для Windows представляет собой версию этого.
Это плохая реализация, потому что программа платит цену исполнения для каждого предложения try (push then pop) даже тогда, когда не возникает никакого исключения.
Хорошие реализации просто записывают таблицу диапазонов, где возникают предложения try. Это означает, что для ввода/выхода из условия try требуется ноль. (My PARLANSE Параллельное программирование langauge использует эту технику). Исключение ищет ПК в точке исключения в таблице и передает управление EH, выбранному таблицей. Код EH сбрасывает стек по мере необходимости. Быстро и красиво. Я думаю, что Windows 64 бит EH имеет этот тип, но я не смотрел внимательно.
Это очень ценная статья о предмете: Как компилятор С++ реализует обработку исключений
Стандартная комиссия С++ опубликовала технический отчет о "производительности С++", чтобы развенчать много мифов о том, как функции С++ якобы замедляют вас. Это также включает сведения о том, как можно реализовать обработку исключений. проект этого технического отчета доступен бесплатно. Проверьте раздел 5.4.1. "Проблемы и методы реализации обработки исключений".
Посмотрите этот документ, который очень хорошо описывает внутренности обработки исключений.