Citado de MSDN sobre StackOverflowException :
La excepción que se produce cuando la pila de ejecución se desborda porque contiene demasiadas llamadas a métodos anidados.
Too many
Es bastante vago aquí. ¿Cómo sé cuando demasiados son realmente demasiados? Miles de llamadas a funciones? Millones? Supongo que debe estar relacionado de alguna manera con la cantidad de memoria en la computadora, pero ¿es posible obtener un orden de magnitud más o menos preciso?
Me preocupa esto porque estoy desarrollando un proyecto que implica un uso intensivo de estructuras recursivas y llamadas a funciones recursivas. No quiero que la aplicación falle cuando empiezo a usarla para algo más que pequeñas pruebas.
.net
exceptions
recursion
stackoverflow
marco-fiset
fuente
fuente
Stack<T>
.editbin /stack:WHATEVER-NUMBER-YOU-LIKE yourexefile.exe
.Respuestas:
A menos que su entorno de lenguaje admita la optimización de llamadas de cola (y su recursión es una llamada de cola), una regla básica es: se debe garantizar que la profundidad de recursión sea O (log n), es decir, usando algoritmos o estructuras de datos basadas en dividir y ... conquistar (como árboles, la mayoría de los alogoritmos de clasificación, etc.) está bien, pero nada lineal (como implementaciones recursivas de manejo de listas enlazadas) no lo está.
fuente
De manera predeterminada, el CLR asigna 1 MB a la pila para cada subproceso (consulte este artículo ). Por lo tanto, son muchas las llamadas que se necesitan para superar esta cantidad. Eso variará dependiendo de cuánto espacio en la pila esté usando cada llamada para cosas como parámetros y variables locales.
Incluso puede hacer que arroje un
StackOverflowException
con una sola llamada si está dispuesto a ser un poco ortodoxo:fuente
Como Cole Campbell observó el tamaño de la memoria y Michael Borgwardt observó la optimización de las llamadas de cola , no los cubriré.
Otra cosa a tener en cuenta es el CPS, que se puede utilizar para optimizar varias funciones entrelazadas, donde la optimización de llamadas de cola es para funciones individuales.
Puede aumentar el tamaño de la pila como lo hicimos aquí , y tenga en cuenta que el código de 64 bits se come la pila más rápido que el código de 32 bits.
Es de destacar que ejecutamos uno de los ejemplos en F # interactivo durante más de 40 horas sin volar la pila. Sí, fue una llamada de función que se ejecutó de forma continua hasta su finalización exitosa.
Además, si necesita hacer una cobertura de código para descubrir dónde ocurren los problemas y no tiene cobertura de código con VS, puede usar TestDriven.NET
fuente