Здравствуйте Anatolix, Вы писали:
A>Деструкторы вызываются для локальных переменных. Их настоящий тип A>известен на момент компиляции и проблем с виртуальностью едесь нет никаких.
A>Если же ты создал объект по new сам его и грохни. Не хочешь возиться с исключениями auto_ptr тебе в помощь.
Ага, это я знаю. Речь совсем не об этом.
Меня интересует не методика написания программ для корректной обработки исключений и освобождения ресурсов, занятых программой, а как компилятор реализует стандарт. Ну, пусть гипотетический компилятор, не в конкретной инкарнации.
Допустим да, есть у нас таблица всех обработчиков исключений, реализованных в программе — сигнатура исключения и список точек входа в соответствующие ловушки.
А вот мне не понятно то, каким образом происходит поиск объектов, сконструированных с момента входа в блок try той ловушки (соответствующей кинутому исключению), которую мы нашли ближайшей для нашего исключения (хотя это тоже нетривиальный момент, без раскрутки стека не обойдется, просто анализ упростится при помощи этой таблицы). Эту вещь я примерно представляю.
Но вот поиск всех сгенеренных объектов между этими двумя точками — тоже собственно, раскрутка стека и анализ кода процедур (ага, вот тут положили на стек пару int-ов и HANDLER — смещаем стек назад. А вот тут у нас заведен класс типа MyClass — нужно позвать деструктор). Деструкторы объектов на стеке компилятор вызывает при нормальном выходе из блока При бросании исключения, видимо, проще тоже позвать их же, но нужно анализировать branch-и разных ветвлений и пр. ерунду. Просто так передать управление на какую-то точку нельзя, нам же просто нужно деструкторы вызвать, а не продолжить работу — после этого блока может идти дальнейшая обработка данных. С другой стороны, код-то уже есть, нужно просто понять где деструкторы заканчиваются и где начинаются деструкторы другого блока, более объемлющего для данной ветки программы.
То ли помещать проверку после каждого окончания блока — а кинули ли исключение? Да — идем на следующий кусок с деструкторами : нет — продолжаем работу.
Например,
long MyMainFunc()
{
MyClass1 mObj;
try
{
MyClass2 mObj2;
long lVal = 1;
char pBuff[1024];
MyFunc1(1); // can throw exception
}
catch(...)
{
}
}
long MyFunc1(long param)
{
MyClass100 mObj100(param);
if (param>2000)
return -1;
if ((param&0x1)==0x1)
{// pp_1
MyClass3 mObj3(param);
long ind=0;
char pBuff[4];
if (MyFunc2(param++)==3)// point1
mObj3.SomeFunc(param);
else
mObj3.SomeFunc(param+2);
} // p_1
else
{
MyClass4 mObj4(param);
MyFunc2(++param);// point2
mObj4.OtherFunc(param);
} //p_2
MyClass5 mObj5(param);
mObj5.OtherCoolFunction;
}// p_3
long MyFunc2(long param) throw myException
{
if (param>1500)
throw new myException(param);
param += 5;
MyFunc1(param);//point3
}// p_4
Я для нагладности привел взаимную рекурсию из двух функций.
В конце концов кинется исключение. То есть, вызовется специальная функция рантайма.
Допустим, есть таблица с указателями на обработчики — там нашли вхождение myException.
В точках point1, point2 и point3 будем находиться во время выхода из функций при раскрутке стека назад.
В точках p_1, p_2, p_3 и p_4 расположен код вызова нужных нам деструкторов. Вот собственно, проблема — то ли раскручивать код назад (допустим, находимся в point1 — назад до точки pp_1 докрутим, а дальше? Анализировать условия ветвления?), то ли прыгать на деструкторы (эти точки p_X еще надо найти).
Видимо, все-таки строится список сконструированных объектов.
Это мое видение, оно может сильно отличаться от истины. Вот я и хотел спросить знатока, как оно внутри устроено. Там же еще наверняка тонкостей выше крыши. Со списками жизнь проще при выкидывании исключения, но есть overhead при нормальной работе.
Это чисто теоретический интерес, не имеющий никакого прикладного значения.
А как работать с файловыми HANDLE, чтобы при генерации исключения файлики закрывались, GDI и прочие ресурсы освобождать — я не это имел в виду. Спасибо, но немножко не оно.
Если запутанно — извините. Можно поконкретнее пообсуждать. Только вот подозреваю, вопрос не будет обсуждаться. Ибо зачем?
Успехов!
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Здравствуйте WPooh, Вы писали:
WP>Если запутанно — извините. Можно поконкретнее пообсуждать. Только вот подозреваю, вопрос не будет обсуждаться. Ибо зачем?
Действительно. если никогда не наблюдал то возьми дизассемблер да посмотри.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>Действительно. если никогда не наблюдал то возьми дизассемблер да посмотри.
Спасибо за совет. Посмотрю на досуге.
Ежели появится adb буду рад с ним поболтать.
Кстати, adb, ты не из XDS случаем?
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Re[11]: Исключения или коды возврата?
От:
Аноним
Дата:
01.10.02 13:39
Оценка:
Здравствуйте WPooh, Вы писали:
WP>Здравствуйте Anatolix, Вы писали:
A>>Действительно. если никогда не наблюдал то возьми дизассемблер да посмотри. WP>Спасибо за совет. Посмотрю на досуге.
WP>Ежели появится adb буду рад с ним поболтать. WP>Кстати, adb, ты не из XDS случаем?
Уже нет -)). Два года назад ушел оттуда.
Собственно я далеко не специалист в этой области. Во-вторых они пишут Java native compiler. А в натуральной Java такой проблемы в принципе нету. Там все объекты создаются в куче и рулятся gc'ом. В XDS компиляторе научились таки в некоторых случаях размешать объекты на стеке, поэтомуй как-то они эту проблему решили. В принципе попробую посмотреть или тупо спросить.
А вообще могу статейку кинуть, которая так и называется "Zero-Overhead Exception Handling Using Metaprogramming", либо в инете её поищи.
Здравствуйте, WPooh, Вы писали:
WP>Это-твоя машинка. Разработчика. А есть машинки у клиентов. У них может вообще стоять старый пень 100 мегагерцовый с 64 SIMM. WP>[off]у нас и некоторых разработчиков не уважают — года по три машины не меняют, гады.[/off]
Даже если три года не менять машину — такого старья быть не может...
На такой машине Win 2000 работает очень с трудом....
Здравствуйте, Max.Subpixel, Вы писали:
MS>Даже если три года не менять машину — такого старья быть не может... MS>На такой машине Win 2000 работает очень с трудом....
А если посмотреть на год сообщения, то получим 2002-3=1999.
В общем, было такое старье. Trust me.
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Здравствуйте, WPooh, Вы писали:
WP>Здравствуйте, Max.Subpixel, Вы писали:
MS>>Даже если три года не менять машину — такого старья быть не может... MS>>На такой машине Win 2000 работает очень с трудом.... WP>А если посмотреть на год сообщения, то получим 2002-3=1999. WP>В общем, было такое старье. Trust me.
не заметил
ну правда я помню, что в 99 мы закупали в офис 433 целерон с 14Гб винтами и 17 дюймами мониторов...