Entry tags:
исключения
Чего-то в зиване никакой активности, еще здесь спрошу:
Кто-нибудь разбирался, как именно в C++ исключения работают? Для конкретного случая GCC? А то я тут полез смотреть в дизассемблированный код, и это просто какая-то загадка природы: вот лежит код из try, в нем никаких дополнительных проверок. Вот лежит код из catch, в нем видно ветвление по типу исключения. Но между ними - никакой связи. Они просто лежат рядом. Как оно его находит? Чтоб сначала выполнить деструкторы из try, а потом перейти в catch? Ну, деструкторы вроде присутствуют в двух копиях, так что может там есть специальный вариант для поимки исключений. Но как оно эти нужные куски находит? Вроде нигде в основном коде нет никаких ссылок на них.
И, кстати, где нынче умное место для таких вопросов? Реддит?
Кто-нибудь разбирался, как именно в C++ исключения работают? Для конкретного случая GCC? А то я тут полез смотреть в дизассемблированный код, и это просто какая-то загадка природы: вот лежит код из try, в нем никаких дополнительных проверок. Вот лежит код из catch, в нем видно ветвление по типу исключения. Но между ними - никакой связи. Они просто лежат рядом. Как оно его находит? Чтоб сначала выполнить деструкторы из try, а потом перейти в catch? Ну, деструкторы вроде присутствуют в двух копиях, так что может там есть специальный вариант для поимки исключений. Но как оно эти нужные куски находит? Вроде нигде в основном коде нет никаких ссылок на них.
И, кстати, где нынче умное место для таких вопросов? Реддит?
no subject
no subject
no subject
no subject
Там на самом деле все интереснее. Первым делом надо раскрутить стек
и найти не просто ближайшую ловушку, но и исполнить все деструкторы на
пути к этой ловушке. Причем если у нас есть код типа
то деструктор для Object1 надо исполнить, а для Object2 - нет, то есть
надо перейти в правильное место в последовательности деструктивного
кода. Выглядит довольно нетривиальным фокусом.
Ну и это, раскручивать стек без базовых регистров - тоже фокус тот еще.
Поэтому если сишный код может в последовательности вызова в начале
функции делать просто
То плюсовому совсем придется делать классическое вида
И если я правильно помню, он это таки делает (сейчас убеждаться лень).
То есть, не zero-cost. Хотя, конечно, оно удобно и для прочей отладки.
Хотя, с еще другой стороны, конечно, если он умеет находить место
для правильного перехода в последовательности деструкторов по
адресу инструкции вызова, то ничего не мешает ему находить тем
же способом размер стека функции по тому же адресу инструкции
и использовать его для раскручивания стека без базовых регистров.
И в-принципе отладчик тоже может пользоваться этой таблицей вместо
отдельной отладочной информации для раскручивания стека.
В-общем, таблица должна получатся интересной и хитрожопой.
no subject
g++ -O -S test.cc
В test.s - ужас и безумие.
no subject
no subject
no subject
http://www.airs.com/blog/archives/464
no subject
no subject
no subject
no subject