По техническим причинам объем стекового пространства фиксирован. Это означает, что рекурсивные алгоритмы с большим объемом ОЗУ находятся в беде: всегда возможно, что некоторые входные данные превысят пороговое значение, и программа потерпит крах, несмотря на то, что еще остается много свободной ОЗУ.
В Windows память для стека зарезервирована , но обычно не commit (кроме .NET). Это означает, что если вашей программе требуется большой стек размером 100 МБ, используется только адресное пространство. Другие программы могут по-прежнему использовать тот же объем ОЗУ, что и до того, как вы заявили, что можете использовать до 100 МБ стека.
В .NET, поскольку пространство стека выделено , общий объем памяти, который могут выделить другие программы, в этом случае уменьшается на 100 МБ, но физическая ОЗУ фактически не выделяется до тех пор, пока ваш алгоритм не станет подлинным это нужно.
Таким образом, увеличение размера стека не так плохо, как вы думаете, особенно если вы не программируете в .NET.
Я столкнулся с ограничением стека алгоритма. К сожалению, наш алгоритм был частью библиотеки. Не желая требовать, чтобы наши вызывающие стороны запускали свои потоки с большим стеком, мы переписали алгоритм для использования явного стека в цикле вместо рекурсии. Это сделало алгоритм медленнее и сложнее для понимания. Это также сделало отладку почти невозможной. Но он сделал свою работу.
Таким образом, перезапись с явным стеком является одной из возможностей, но я рекомендую против этого, если только вы абсолютно не должны обрабатывать входящие данные, независимо от их размера, вплоть до предела доступной оперативной памяти и не довольны установкой меньшего жесткого диска. ограничение.