sab123: (Default)
SB ([personal profile] sab123) wrote2012-05-04 11:30 am

исключения

Чего-то в зиване никакой активности, еще здесь спрошу:

Кто-нибудь разбирался, как именно в C++ исключения работают? Для конкретного случая GCC? А то я тут полез смотреть в дизассемблированный код, и это просто какая-то загадка природы: вот лежит код из try, в нем никаких дополнительных проверок. Вот лежит код из catch, в нем видно ветвление по типу исключения. Но между ними - никакой связи. Они просто лежат рядом. Как оно его находит? Чтоб сначала выполнить деструкторы из try, а потом перейти в catch? Ну, деструкторы вроде присутствуют в двух копиях, так что может там есть специальный вариант для поимки исключений. Но как оно эти нужные куски находит? Вроде нигде в основном коде нет никаких ссылок на них.

И, кстати, где нынче умное место для таких вопросов? Реддит?

[identity profile] juan-gandhi.livejournal.com 2012-05-04 03:44 pm (UTC)(link)
stackoverflow - там ответят

[identity profile] spamsink.livejournal.com 2012-05-04 04:25 pm (UTC)(link)
Насколько я понимаю, при throw функция __cxa_throw по стеку лазит и сама всё вызывает.

[identity profile] sleepy-drago.livejournal.com 2012-05-04 05:57 pm (UTC)(link)
они много хвастались своей гцц реализацией исключений - так что есть куча описаний. Если читать выжимки то в памяти остается примерно следующее: компилятор генерирует таблицу вариантов раскрутки. Она страшная но если ничего не выброшено то она может себетихо лежать на диске под слоем пыли и никто ее трогать не будет. Соответственно оверхед самого выброса тут весьма большой. Для получения указаний что итать наверное поиск по стековерфлоу самый удачный вариант.