Когда вы вызываете функцию, в стеке выделяется новое «пространство имен». Вот так у функций могут быть локальные переменные. Поскольку функции вызывают функции, которые, в свою очередь, вызывают функции, мы продолжаем выделять все больше и больше места в стеке для поддержания этой глубокой иерархии пространств имен.
Чтобы ограничить программы, использующие большие объемы стекового пространства, ограничение обычно устанавливается через ulimit -s
. Если мы удалим это ограничение с помощью ulimit -s unlimited
, наши программы смогут продолжать поглощать оперативную память для своего постоянно растущего стека, пока в конечном итоге в системе полностью не закончится память.
int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.
Обычно использование тонны пространства стека является случайным или признаком очень глубокой рекурсии, которая, вероятно, не должна так сильно полагаться на стек. Таким образом, предел стека.
Влияние на производительность незначительно, но все же существует. Используя команду time
, я обнаружил, что устранение ограничения стека увеличивает производительность на несколько долей секунды (по крайней мере, на 64-битной Ubuntu).
person
Alex V
schedule
23.01.2013