Quiero hacer DFS en una matriz de 100 X 100. (Digamos que los elementos de la matriz representan nodos de gráficos) Por lo tanto, asumiendo el peor de los casos, la profundidad de las llamadas a funciones recursivas puede llegar hasta 10000 y cada llamada ocupa hasta 20 bytes. Entonces, ¿es factible? ¿Existe la posibilidad de un desbordamiento de pila?
¿Cuál es el tamaño máximo de pila en C / C ++?
Especifique gcc para
1) cygwin en Windows
2) Unix
¿Cuáles son los límites generales?
Respuestas:
En Visual Studio, el tamaño de pila predeterminado es de 1 MB, creo, por lo que con una profundidad de recursividad de 10,000, cada marco de pila puede tener como máximo ~ 100 bytes, lo que debería ser suficiente para un algoritmo DFS.
La mayoría de los compiladores, incluido Visual Studio, le permiten especificar el tamaño de la pila. En algunas versiones de Linux (¿todas?), El tamaño de la pila no es parte del ejecutable sino una variable de entorno en el sistema operativo. A continuación, puede comprobar el tamaño de la pila con
ulimit -s
y establecerlo en un nuevo valor con, por ejemploulimit -s 16384
.Aquí hay un enlace con los tamaños de pila predeterminados para gcc.
DFS sin recursividad:
fuente
las pilas de hilos suelen ser más pequeñas. Puede cambiar el valor predeterminado en el momento del enlace o también en el tiempo de ejecución. Como referencia, algunos valores predeterminados son:
fuente
Dependiente de la plataforma, dependiente de la cadena de herramientas, dependiente de ulimit, dependiente de los parámetros ... No se especifica en absoluto, y hay muchas propiedades estáticas y dinámicas que pueden influir en él.
fuente
Sí, existe la posibilidad de que la pila se desborde. El estándar C y C ++ no dicta cosas como la profundidad de la pila, generalmente son un problema ambiental.
La mayoría de los entornos de desarrollo y / o sistemas operativos decentes le permitirán adaptar el tamaño de pila de un proceso, ya sea en el enlace o en el momento de la carga.
Debe especificar qué sistema operativo y entorno de desarrollo está utilizando para obtener una asistencia más específica.
Por ejemplo, en Ubuntu Karmic Koala, el valor predeterminado para gcc es 2M reservado y 4K comprometido, pero esto se puede cambiar al vincular el programa. Utilice la
--stack
opción deld
para hacer eso.fuente
Me quedé sin pila en el trabajo, era una base de datos y estaba ejecutando algunos subprocesos, básicamente el desarrollador anterior había lanzado una gran matriz en la pila, y la pila estaba baja de todos modos. El software se compiló con Microsoft Visual Studio 2015.
A pesar de que el hilo se había quedado sin pila, falló silenciosamente y continuó, solo se desbordó la pila cuando llegó el momento de acceder al contenido de los datos en la pila.
El mejor consejo que puedo dar es no declarar matrices en la pila, especialmente en aplicaciones complejas y particularmente en subprocesos, en su lugar use heap. Para eso está ahí;)
También tenga en cuenta que puede que no falle inmediatamente al declarar la pila, sino solo en el acceso. Supongo que el compilador declara la pila en Windows de forma "optimista", es decir, asumirá que la pila ha sido declarada y tiene el tamaño suficiente hasta que la utilice y luego descubra que la pila no está allí.
Los diferentes sistemas operativos pueden tener diferentes políticas de declaración de pila. Deje un comentario si conoce estas políticas.
fuente
No estoy seguro de lo que quiere decir con hacer una búsqueda en profundidad en una matriz rectangular, pero supongo que sabe lo que está haciendo.
Si el límite de la pila es un problema, debería poder convertir su solución recursiva en una solución iterativa que inserte valores intermedios en una pila que se asigna desde el montón.
fuente