С/C++ максимальный размер стека программы



Я хочу сделать DFS на массиве 100 X 100. (Скажем, элементы массива представляют узлы графа) поэтому, предполагая наихудший случай, глубина рекурсивных вызовов функций может доходить до 10000 с каждым вызовом, занимающим до 20 байт. Так это осуществимые средства есть ли возможность stackoverflow?



каков максимальный размер стека в C / C++?




пожалуйста, укажите для gcc для обоих

1) cygwin на Windows

2) Unix




Что такое общие ограничения?

1326   6  

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

    Ничего не найдено.