sab123: (Default)
[personal profile] sab123
Чего-то в зиване никакой активности, еще здесь спрошу:

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

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

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

Date: 2012-05-07 03:20 pm (UTC)
From: [identity profile] sab123.livejournal.com
Оказалось, что готового там нету. Ну да ладно, уже тута разобрались. Не понадобилось там спрашивать.

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

Date: 2012-05-04 04:30 pm (UTC)
From: [identity profile] sab123.livejournal.com
Ну вот мне и интересно, как она лазит. В общих чертах, чтоб самому ее не читать. Вот даже скопирую, чего я в зиван дальше писал:

Там на самом деле все интереснее. Первым делом надо раскрутить стек
и найти не просто ближайшую ловушку, но и исполнить все деструкторы на
пути к этой ловушке. Причем если у нас есть код типа

{
  Type1 Object1;
  ...
  // here it throws
  ...
  Type2 Object2;
  ...
}


то деструктор для Object1 надо исполнить, а для Object2 - нет, то есть
надо перейти в правильное место в последовательности деструктивного
кода. Выглядит довольно нетривиальным фокусом.

Ну и это, раскручивать стек без базовых регистров - тоже фокус тот еще.
Поэтому если сишный код может в последовательности вызова в начале
функции делать просто

  sub 0x200, %rsp


То плюсовому совсем придется делать классическое вида

  push %rbp
  mov %rsp, %rbp
  sub 0x200, %rsp


И если я правильно помню, он это таки делает (сейчас убеждаться лень).
То есть, не zero-cost. Хотя, конечно, оно удобно и для прочей отладки.

Хотя, с еще другой стороны, конечно, если он умеет находить место
для правильного перехода в последовательности деструкторов по
адресу инструкции вызова, то ничего не мешает ему находить тем
же способом размер стека функции по тому же адресу инструкции
и использовать его для раскручивания стека без базовых регистров.
И в-принципе отладчик тоже может пользоваться этой таблицей вместо
отдельной отладочной информации для раскручивания стека.

В-общем, таблица должна получатся интересной и хитрожопой.

Date: 2012-05-04 04:45 pm (UTC)
From: [identity profile] spamsink.livejournal.com
Так она и получается:
int i;
struct S { ~S() { ++i; } };
extern void bar();
void foo() {
	bar();
	S a;
	bar();
	S b;
}


g++ -O -S test.cc

В test.s - ужас и безумие.

Edited Date: 2012-05-04 04:46 pm (UTC)

Date: 2012-05-04 10:22 pm (UTC)
From: [identity profile] sab123.livejournal.com
Вообще говоря, без -O ужаса гораздо больше :-)

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

Date: 2012-05-04 07:47 pm (UTC)
From: [identity profile] sab123.livejournal.com
Вроде вот нашлось, хоть и все равно не очень внятно:

http://www.airs.com/blog/archives/464

Date: 2012-05-04 08:05 pm (UTC)
From: [identity profile] sleepy-drago.livejournal.com
выглядит как детальное описание потрохов :) Там указано и где лежит таблица и как функции которые они генерят на раскрутку в ней ковыряются. Теперь вопрос а зачем надо? Если речь идет о скорости то ответ тут "не используйте исключений" :D

Date: 2012-05-04 10:21 pm (UTC)
From: [identity profile] sab123.livejournal.com
Ну, моя изначальная проблема была о корректности. Но я уже нашел, где у меня был глюк (как оказалось, в голове).

Date: 2012-05-05 07:53 am (UTC)
From: [identity profile] sleepy-drago.livejournal.com
ну есть имхо что нет смысла стесняться с проблемами и сразу искать, смотреть, спрашивать саму проблему а не британскую энциклопедию :)

Date: 2012-05-05 03:59 pm (UTC)
From: [identity profile] sab123.livejournal.com
Так проблему-то я давно решил. Теперь мне интересна энциклопедия.

July 2025

S M T W T F S
  1 2345
6789101112
13141516171819
20212223242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 8th, 2025 02:59 am
Powered by Dreamwidth Studios