2012-05-13 9 views
5

Todos sabemos que es una buena práctica crear métodos pequeños que promuevan la reutilización, lo que inevitablemente provocará que se coloquen muchos métodos en la pila. Sin embargo, ¿es posible llegar al escenario donde hay tantas llamadas a métodos anidados que se produce una excepción StackOverflow?¿Es posible tener demasiados métodos en términos de tamaño de pila y posible desbordamiento?

¿La solución aceptada sería simplemente aumentar el tamaño de la pila?

documentation states que se producirá una excepción de este tipo durante una "recursividad muy profunda o sin límites", por lo que parece posible, ¿o el .NET Framework maneja dinámicamente el tamaño de pila para nosotros?

Mi pregunta se puede resumir así:

¿Es posible tener un programa tan bien diseñado (en términos de pequeños métodos reutilizables) que es se convierte en necassary para aumentar el tamaño pila y por lo tanto usar mas recursos?

Respuesta

2

No realmente. Acabo de hacer una prueba muy rápida, y se produce una StackOverflowException después de 15,000 llamadas anidadas.

No hay forma de que escriba código que anidará de forma no recursiva 15,000 veces debido a la gran cantidad de métodos que tiene.

Obviamente, el número exacto depende de muchas variables de función local que haya asignado en la pila. Pero cualquiera que sea el número real, no es suficiente para hacer lo que estás sugiriendo.

3

El tamaño de la pila .NET es fijo y 1 MB por defecto.

¿Es posible tener un programa tan bien diseñado (en términos de pequeños métodos reutilizables) que se vuelve necesario para aumentar el tamaño de la pila y, por lo tanto, utilizar más recursos?

No será en la descomposición de su lógica en métodos.

La única forma en que se encontrará con un desbordamiento de pila que no es un error directo es con la recursividad. Y cuando eso sucede (amenaza), no aumente la pila pero reescriba el código para usar una forma diferente de almacenar datos (como un Stack<T>).

0

En el mundo administrado, la pila tiene un papel especial para el rendimiento. Si logras asignar algo en la pila (usando primitivas o estructuras) no tienes que ponerlo en el montón. Asignar en el montón agrega presión de GC que, en promedio, desacelera el programa.

Para poder visualizar un programa que es más rápido asignando muchas cosas en la pila. Incluso utilizando stackalloc (que es una característica menos conocida de C#/CLR).

Existen casos válidos para hacer esto. Ellos son raros. Simplemente decir "no hay usos válidos" es completamente erróneo.

+0

¿Estás seguro de que estás respondiendo la pregunta correcta? –

+0

@ MahmoudAl-Qudsi - Estoy de acuerdo, esto no es lo que estaba preguntando –

+0

@ m.edmondson, ¿pueden dar más detalles sobre lo que quieren saber? Respondí la pregunta que planteaste en el último párrafo: ¿Hay razones válidas para programar de tal manera que requiera aumentar el tamaño de la pila. Di razones para eso.¿Entendí mal algo? – usr

Cuestiones relacionadas