Найти максимальную глубину рекурсии

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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