Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно ли очищать стек при выкидывании Exception ? в рекурсивных функциях, например 
:(
    Опции темы
En_t_end
Дата 24.10.2005, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



srd
Some obj;
try
{
Some obj2;
}
catch(...)
{
//
//
//
}
Для каких обьектов будет вызван деструктор при возникновении исключения ?
PM MAIL ICQ Skype GTalk Jabber   Вверх
srd
Дата 24.10.2005, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Так как в твоём примере нигде нет инструкции throw, то могу предположить, что исключение бросается внутри конструктора класса Some.
а) Если исключение будет брошено при конструировании объекта obj, то будут вызваны деструкторы для тех объектов-членов, для которых успели отработать конструкторы. Для остальных объектов-членов деструкторы вызваны не будут. Деструктор для самого obj и ob2 тоже вызван не будет.
б) Если исключение будет брошено при конструировании obj2, то ни для самого obj, ни для его членов деструкторы не вызовутся. Для obj2 деструктор тоже не будет вызван. Будут вызваны деструкторы только для объектов-членов obj2, для которых успели отработать конструкторы до исключения.



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
En_t_end
Дата 24.10.2005, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



srd
Все верно...
PM MAIL ICQ Skype GTalk Jabber   Вверх
Helicopterr
  Дата 24.10.2005, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



Цитата(Void @ 24.10.2005, 09:22)
Линкер VC++ по умолчанию задает размер стека 1 Мб. Получаем максимально возможную глубину рекурсии порядка 10^5, что все равно выходит за диапазон short (пар-р chislo).

возвращает то ф-ция long double а не short.
вобщем при использовании рекурсии надо считать сколько в этой функции выделяется памяти под переменные и умножать на предполагаемую глубину рекурсии а затем сравнвать это с 1Мб? И если получилось больше то рекурсию не использовать?

И ещё правда, что рекурсия работает более медленно, чем тот же алгоритм, реализованный на циклах?

Это сообщение отредактировал(а) Helicopterr - 24.10.2005, 22:42


--------------------
people can fly
PM MAIL   Вверх
Void
Дата 24.10.2005, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Helicopterr @ 25.10.2005, 00:41)
возвращает то ф-ция long double а не short.

При чем тут возвращаемое значение? Глубина рекурсии в твоем примере равна chislo - 1.
Цитата(Helicopterr @ 25.10.2005, 00:41)
вобщем при использовании рекурсии надо считать сколько в этой функции выделяется памяти под переменные

+ параметры ф-ции. Но точный размер можно узнать, только посмотрев ассемблерный листинг сгенерированного кода.
Цитата(Helicopterr @ 25.10.2005, 00:41)
И ещё правда, что рекурсия работает более медленно, чем тот же алгоритм, реализованный на циклах?

Вообще говоря, да, но закладываться на это не стоит. Нормально раскрутить в цикл можно только хвостовую рекурсию, для остальных случаев все равно приходиться эмулировать стек вручную, что не особо повышает скорость, но существенно снижает читаемость кода.
Цитата(Helicopterr @ 25.10.2005, 00:41)
И если получилось больше то рекурсию не использовать?

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Helicopterr
  Дата 24.10.2005, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



Цитата(Void @ 24.10.2005, 22:54)
А производить такие расчеты для каждой рекурсивной ф-ции - имхо, странное занятие.

Cпасибо согласен.
Однако вроде бы программный стек увеличивается динамически по мере объявления в программе новых переменных, отхватывая динамическую память "куча"?
Что за информация об огораничении стека линкером в 1Мб?

Это сообщение отредактировал(а) Helicopterr - 24.10.2005, 23:09


--------------------
people can fly
PM MAIL   Вверх
Void
Дата 24.10.2005, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Helicopterr @ 25.10.2005, 01:08)
Однако вроде бы программный стек увеличивается динамически по мере объявления в программе новых переменных, отхватывая динамическую память "куча"?

Да, это так, но 1 Мб здесь указывает именно на предельный размер, который система позволит выделить. Когда стек превышает указанный при создании потока предел, выбрасывается исключение.

P.S. Забавный компилятор VC++ 8.0:
Код
void rectest(int param) {
    printf("%i\n", param);
    rectest(param + 1);
}

Цитата
warning C4717: 'rectest' : recursive on all control paths
, function will cause runtime stack overflow

Код
_rectest PROC
    push    esi
    mov    esi, DWORD PTR _param$[esp]
$LL3@rectest:
    push    esi
    push    OFFSET $SG2462
    call    _printf
    add    esp, 8
    add    esi, 1
    jmp    SHORT $LL3@rectest
_rectest ENDP

Без комментариев smile Но за оптимизацию хвостовой рекурсии +1.
P.P.S. Впрочем, и за предупреждение тоже - все-таки, нехилый там анализ кода производится.

Это сообщение отредактировал(а) Void - 24.10.2005, 23:37


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Helicopterr
Дата 24.10.2005, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



Void
Как вцелом компилятор VC++ 8.0? Лучше 7-го?


--------------------
people can fly
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0741 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.