С/C++ максимальный размер стека программы
Я хочу сделать DFS на массиве 100 X 100. (Скажем, элементы массива представляют узлы графа) поэтому, предполагая наихудший случай, глубина рекурсивных вызовов функций может доходить до 10000 с каждым вызовом, занимающим до 20 байт. Так это осуществимые средства есть ли возможность stackoverflow?
каков максимальный размер стека в C / C++?
пожалуйста, укажите для gcc для обоих
1) cygwin на Windows
2) Unix
Что такое общие ограничения?
6 ответов:
в Visual Studio размер стека по умолчанию составляет 1 МБ, я думаю, поэтому с глубиной рекурсии 10 000 каждый кадр стека может быть не более ~100 байт, что должно быть достаточно для алгоритма DFS.
большинство компиляторов, включая Visual Studio позволяют указать размер стека. На некоторых (все?) linux ароматизирует размер стека не является частью исполняемого файла, а переменной среды в ОС. Затем вы можете проверить размер стека с помощью
ulimit -sи установите его в новое значение, напримерulimit -s 16384.здесь ссылке С размерами стека по умолчанию для gcc.
DFS без рекурсии:
std::stack<Node> dfs; dfs.push(start); do { Node top = dfs.top(); if (top is what we are looking for) { break; } dfs.pop(); for (outgoing nodes from top) { dfs.push(outgoing node); } } while (!dfs.empty())
стеки для потоков часто меньше. Вы можете изменить значение по умолчанию во время ссылки , или изменить во время выполнения тоже. Для справки некоторые значения по умолчанию:
- glibc i386, x86_64 7.4 MB
- Tru64 5.1 5.2 MB
- Cygwin 1.8 MB
- Solaris 7..10 1 MB
- MacOS X 10.5 460 КБ
- AIX 5 98 KB
- OpenBSD 4.0 64 КБ
- HP-UX 11 16 KB
, набор инструментов зависит от параметр ulimit-зависимых, зависящих от параметров.... Он вообще не указан, и есть много статических и динамических свойств, которые могут повлиять на него.
Да, есть возможность переполнения стека. Стандарт C и C++ не диктует такие вещи, как глубина стека, это, как правило, экологическая проблема.
большинство достойных сред разработки и / или операционных систем позволят вам адаптировать размер стека процесса, либо во время ссылки, либо во время загрузки.
вы должны указать, какую ОС и среду разработки вы используете для более адресной помощи.
например, в Ubuntu Karmic Koala, по умолчанию для gcc зарезервировано 2M и зафиксировано 4K, но это может быть изменено при связывании программы. Используйте на
ldдля этого.
Я не уверен, что вы имеете в виду, делая глубину первого поиска на прямоугольном массиве, но я предполагаю, что вы знаете, что вы делаете.
Если ограничение стека является проблемой, вы должны быть в состоянии преобразовать рекурсивное решение в итеративное решение, которое толкает промежуточные значения в стек, который выделяется из кучи.
У меня просто закончился стек на работе, это была база данных, и в ней были запущены некоторые потоки, в основном предыдущий разработчик бросил большой массив в стек, и стек был низким в любом случае. Программное обеспечение было скомпилировано с использованием Microsoft Visual Studio 2015.
несмотря на то, что поток закончился из стека, он молча потерпел неудачу и продолжил работу, он только переполнялся стеком, когда дело доходило до доступа к содержимому данных в стеке.
лучший совет, который я могу дать, чтобы не объявляйте массивы в стеке-особенно в сложных приложениях и особенно в потоках, вместо этого используйте кучу. Вот для чего он там;)
также просто имейте в виду, что он может не сработать сразу при объявлении стека, но только при доступе. Я предполагаю, что компилятор объявляет стек под windows "оптимистично", т. е. он будет предполагать, что стек был объявлен и достаточно велик, пока он не начнет его использовать, а затем узнает, что стек не является там.
разные операционные системы могут иметь разные политики объявления стека. Пожалуйста, оставьте комментарий, если вы знаете, что это за политика.
Comments