исключения
May. 4th, 2012 11:30 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Чего-то в зиване никакой активности, еще здесь спрошу:
Кто-нибудь разбирался, как именно в C++ исключения работают? Для конкретного случая GCC? А то я тут полез смотреть в дизассемблированный код, и это просто какая-то загадка природы: вот лежит код из try, в нем никаких дополнительных проверок. Вот лежит код из catch, в нем видно ветвление по типу исключения. Но между ними - никакой связи. Они просто лежат рядом. Как оно его находит? Чтоб сначала выполнить деструкторы из try, а потом перейти в catch? Ну, деструкторы вроде присутствуют в двух копиях, так что может там есть специальный вариант для поимки исключений. Но как оно эти нужные куски находит? Вроде нигде в основном коде нет никаких ссылок на них.
И, кстати, где нынче умное место для таких вопросов? Реддит?
Кто-нибудь разбирался, как именно в C++ исключения работают? Для конкретного случая GCC? А то я тут полез смотреть в дизассемблированный код, и это просто какая-то загадка природы: вот лежит код из try, в нем никаких дополнительных проверок. Вот лежит код из catch, в нем видно ветвление по типу исключения. Но между ними - никакой связи. Они просто лежат рядом. Как оно его находит? Чтоб сначала выполнить деструкторы из try, а потом перейти в catch? Ну, деструкторы вроде присутствуют в двух копиях, так что может там есть специальный вариант для поимки исключений. Но как оно эти нужные куски находит? Вроде нигде в основном коде нет никаких ссылок на них.
И, кстати, где нынче умное место для таких вопросов? Реддит?
no subject
Date: 2012-05-04 03:44 pm (UTC)no subject
Date: 2012-05-07 03:20 pm (UTC)no subject
Date: 2012-05-04 04:25 pm (UTC)no subject
Date: 2012-05-04 04:30 pm (UTC)Там на самом деле все интереснее. Первым делом надо раскрутить стек
и найти не просто ближайшую ловушку, но и исполнить все деструкторы на
пути к этой ловушке. Причем если у нас есть код типа
то деструктор для Object1 надо исполнить, а для Object2 - нет, то есть
надо перейти в правильное место в последовательности деструктивного
кода. Выглядит довольно нетривиальным фокусом.
Ну и это, раскручивать стек без базовых регистров - тоже фокус тот еще.
Поэтому если сишный код может в последовательности вызова в начале
функции делать просто
То плюсовому совсем придется делать классическое вида
И если я правильно помню, он это таки делает (сейчас убеждаться лень).
То есть, не zero-cost. Хотя, конечно, оно удобно и для прочей отладки.
Хотя, с еще другой стороны, конечно, если он умеет находить место
для правильного перехода в последовательности деструкторов по
адресу инструкции вызова, то ничего не мешает ему находить тем
же способом размер стека функции по тому же адресу инструкции
и использовать его для раскручивания стека без базовых регистров.
И в-принципе отладчик тоже может пользоваться этой таблицей вместо
отдельной отладочной информации для раскручивания стека.
В-общем, таблица должна получатся интересной и хитрожопой.
no subject
Date: 2012-05-04 04:45 pm (UTC)g++ -O -S test.cc
В test.s - ужас и безумие.
no subject
Date: 2012-05-04 10:22 pm (UTC)no subject
Date: 2012-05-04 05:57 pm (UTC)no subject
Date: 2012-05-04 07:47 pm (UTC)http://www.airs.com/blog/archives/464
no subject
Date: 2012-05-04 08:05 pm (UTC)no subject
Date: 2012-05-04 10:21 pm (UTC)no subject
Date: 2012-05-05 07:53 am (UTC)no subject
Date: 2012-05-05 03:59 pm (UTC)