2016-03-01 2 views
10

Есть ли способ узнать в C++ максимальную глубину рекурсии без явного вызова рекурсии, пока он не падает?Найти Максимальная глубина рекурсии

Я видел, что это ограничено размером стека. Возможно, может быть полезно найти на определенном уровне рекурсии количество свободного места в стеке. Является ли это возможным?

+1

Там нет ничего в 'C++ ', который определяет максимальную глубину. Максимальная глубина зависит от архитектуры процессора, деталей реализации конкретного компилятора и фактической функции, которая рекурсируется (вместе с дочерними функциями, которые она вызывает).Как и любая другая проблема, конечно, если вы знаете все параметры, вы можете определить решение .... но в этом случае, вероятно, гораздо проще просто выполнить явный вызов и посмотреть, что вы получаете. – mah

+1

Хотя в '[temp.inst] есть абзац, в котором указано, что определенная величина реализована. – NathanOliver

+1

Так что, если есть способ, чтобы проверить свободный размер стека для того, чтобы остановить рекурсию, когда она ниже указанного предела? – Jepessen

ответ

2

Единственное, что я могу думать прямо сейчас, чтобы использовать getrlimit, чтобы получить максимальный размер стека, посвященный процесса. Следующее, что нужно сделать, это найти способ получения текущего размера стека. Я думал, что getrusage это путь, но после того, как смотреть на man -page и пару постов на SO не кажется, что она больше не поддерживает эту особенность. Поэтому вам нужно найти другой способ. Я полагаю, что Valgrind также сообщает об использовании стека, поэтому он изучает исходный код, и документация может оказаться полезной.

После того, как вы можете получить текущий размер стека вы можете измерить

  • свое первоначальное состояние, прежде чем начать рекурсии (так что вы можете исключить это из ваших расчетов, так как она не имеет ничего делать с самой рекурсией)

  • его изменения для одной итерации

Без учета первоначального распределения стеки вместе с USI ng общий размер стека и распределение, необходимые для одного этапа рекурсии, вы должны иметь возможность аппроксимировать количество рекурсий, которые вы можете иметь для данной системы. Я не уверен, если он будет работать, а также такие измерения, даже если точны сильно зависят от системы, которую вы используете (после того, как все стек тесно связаны с количеством виртуальной памяти процесс может иметь).

2

Максимальная глубина рекурсии зависит от объема памяти, используемого функциями (функциями), объемом памяти на вашей платформе и пределами (если есть) ОС или компилятором.

В рекурсивном вызове, память занята:

  • накладные расходы вызова функции
  • память, занятую параметрами, передаваемыми.
  • память занята локальными переменными

рекурсивная функция без параметров и без локальных переменных будет иметь более высокую возможную глубину (количество рекурсивных вызовов), чем функция, которая проходит много крупных объектов и занимает много локальных переменных.

Итак, ответ на ваш вопрос: максимальное количество рекурсивных вызовов зависит от объема памяти, занимаемой рекурсивным вызовом, объема памяти в системе и любых ограничений, налагаемых компилятором или операционной системой. Различные рекурсивные функции занимают разный объем памяти.

Если вы знаете все эти предметы, вы можете рассчитать максимальное количество возможных рекурсий.

Смежные вопросы