Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2015, 23:22   #11
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Цитата:
Сообщение от Мефала Посмотреть сообщение
Зачем столько нервов? Я ведь просто мнение спросила... Перепишу под цикл, если не съедите.


Показалось проще... Но уже почитала про "съедение стэка" и все дела, так что исправлю, спасибо.
Всегда, ВСЕГДА избегай рекурсии если можно сделать циклом.

Для вызова функции требуется передать ей адрес возврата, в стандартных конвенциях вызовов адрес возврата передается через стек, в 32-х битных приложениях занимает 4 байта.

Для вызова функции используются инструкция call для вызова и ret для возврата, связка которых НАМНОГО, НАМНОГО медленнее операторов условного перехода.
К тому же, стек не резиновый, допустим, по умолчанию имеется стек 1 мб.

Пренебрегая занятой областью - мы имеем 1048576 байта, т.е при вложенности рекурсии рядом со значением 262144 у нас произойдет переполнение стека и программа вылетит.

Это в теории, а на практике у нас вылет произойдет гораздо раньше, т.к все локальные переменные лежат на стеке, т.е занимают память на стеке, а освобождаются только при возврате из функции, т.е после того, как условие углубления в рекурсию будет ложно.

Пример: программа входит в рекурсию декрементируя некоторое значение N до тех пор, пока N не станет отрицательным. Программа использует локально-объявленный массив типа int из 100 элементов. Найти N при котором программа вылетит с вероятностью 1, стек равен 1 мб.
Сможешь?)))


---------
Ответ: При N = 2570, пугает? 1 МБ = 1024 * 1024 байт, одна функция занимает в стеке 100 * 4 байт + 4 байт ( адрес возврата ) + 4 байт ( сохранение значения регистра ebp )


Добро пожаловать в реальность, киса

Последний раз редактировалось Malriser; 15.12.2015 в 23:36.
Malriser вне форума Ответить с цитированием
Старый 15.12.2015, 23:33   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Для вызова функции требуется передать ей адрес возврата, в стандартных конвенциях вызовов адрес возврата передается через стек, в 32-х битных приложениях занимает 4 байта.
Если говорить о рекурсии как о методике, то это не всегда так. Не пудри человеку моск.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2015, 23:38   #13
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если говорить о рекурсии как о методике, то это не всегда так. Не пудри человеку моск.
А я не пудрю, я практик, а не теоретик.

Ты заставь скомпилировать компилятор код, чтобы он вызывал функцию через jmp, а возвращался через jmp r32. Да даже на асме никто не будет так реализовывать вызов функций, ибо извращение.

На практике - рекурсия, самое медленное, как можно реализовать алгоритм

При всем уважении, но ТАКОЕ можно объяснить только так, как я описал. И я не пудрю мозги, а то потом удивляются, почему рекурсия вызывает вылет даже при глубине 2570, а при 2500 работает спокойно. А читайте мой предыдущий пост


Последний раз редактировалось Malriser; 15.12.2015 в 23:47.
Malriser вне форума Ответить с цитированием
Старый 16.12.2015, 13:39   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ты заставь скомпилировать компилятор код, чтобы он вызывал функцию через jmp, а возвращался через jmp r32. Да даже на асме никто не будет так реализовывать вызов функций, ибо извращение.
Ты забываешь, что компиляторов существует чуть больше чем 1 )
Например VM Автолиспа рекурсию умеет сворачивать и даже предсказывать.
Так что повторюсь: Не убеждай ТС в том что существует только один путь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.12.2015, 13:54   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Виталий, обратите внимание, что обсуждение идёт в ветке "С/C++"
Вы готовы представить пруф - компилятор C/C++, который развернёт рекурсию в цикл? На примере того самого злополучного кода с BubleSort?
В полученном выполняемом файле не будет рекурсии (т.е. вложенного вызова процедурой самой себя)?!!

Не пойму, к чему этот спор? К тому, что мы все не правы, и в каких-то компиляторах (том же Лиспе) нужно использовать рекурсию всегда, вместо всех циклов, пусть компилятор удивится?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.12.2015, 13:58   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как хотите. Потом не удивляйтесь, когда при отладке вам отладчик выкатит неожиданные действия после того как оптимизатор поработает.
Я офф...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритмы сортировки Cи Панdopa Помощь студентам 6 17.06.2015 15:06
Ошибка.Алгоритмы сортировки.Язык си. East Undia Trading Помощь студентам 6 14.05.2014 22:42
Алгоритмы сортировки пирамидальный(кучей) и быстрой сортировки (с++) mmd12 Помощь студентам 4 17.05.2012 14:14
Алгоритмы сортировки массивов С++ Sunless Помощь студентам 1 29.03.2011 17:10
C++ алгоритмы сортировки 1ok Помощь студентам 5 18.09.2010 15:27