Модели обработки исключений в GCC
GCC поддерживает модели обработки исключений Setjump-longjump (sjlj) и Dwarf2 на основе таблицы (dw2). В чем разница между двумя моделями и как выбрать подходящую модель? Почему раскрутка Dwarf2 на основе таблиц (dw2) является более эффективной моделью? Я понимаю, что две модели нельзя смешивать.
Ссылка: Предварительный просмотр технологии: gcc-4.2.1-sjlj -2
2 ответа
Что ж, dwarf2 создает таблицы для каждой функции, которые содержат данные о том, что представляют собой сохраненные регистры вызываемого абонента и где они хранятся в стеке, где находится указатель кадра / адрес возврата в стеке вызовов, и некоторые другие вещи. Если вы используете dwarf2, компилятор может использовать эту информацию и эффективно восстанавливать регистры и возвращаться к вызывающим в случае исключения. Бэкэнды должны предоставлять информацию в коде, генерирующем пролог своих реализаций, сообщать GCC, какие регистры сохраняются вызываемым пользователем, и когда был сохранен указатель кадра и тому подобное.
Использование setjmp/longjmp - это просто взлом. Поскольку setjmp/longjmp не знает о структуре функции throw, он восстановит все регистры, сохраненные в буферном прыжке с помощью setjmp, даже если они не были переопределены функцией throwing. Я на самом деле не эксперт в этом, но я думаю, очевидно, что это не будет эффективным. Кроме того, каждый раз, когда вы запускаете блок try, для вызова буфера, содержащего сохраненные регистры, необходимо вызывать setjmp, а при использовании dwarf2 компилятор уже предоставляет всю необходимую информацию во время компиляции.
Если бэкэнды не предоставляют необходимую информацию, GCC автоматически переключится на обработку исключений на основе setjmp/longjmp.
Обратите внимание, я не эксперт GCC. Я просто перенес набор инструментов на простой процессор моего профессора, включая GCC. Я надеюсь, что смогу немного помочь тебе.
Избегайте сълй. Каждый блок "try " будет вызывать setjmp, который сохраняет регистры, что приводит к снижению производительности, даже если исключений нет. При использовании таблиц обычный поток управления не требует затрат на выполнение. Только когда возбуждается исключение, механизм обработки исключений должен разбираться в таблицах, чтобы выяснить, что делать.