Citado no MSDN sobre StackOverflowException :
A exceção que é lançada quando a pilha de execução é estourada porque contém muitas chamadas de método aninhadas.
Too many
é bem vago aqui. Como sei quando muitos são realmente muitos? Milhares de chamadas de função? Milhões? Suponho que ele deva estar relacionado de alguma forma à quantidade de memória no computador, mas é possível chegar a uma ordem de magnitude aproximadamente precisa?
Estou preocupado com isso porque estou desenvolvendo um projeto que envolve um uso intenso de estruturas recursivas e chamadas de função recursivas. Não quero que o aplicativo falhe quando começar a usá-lo para mais do que apenas pequenos testes.
.net
exceptions
recursion
stackoverflow
marco-fiset
fonte
fonte
Stack<T>
.editbin /stack:WHATEVER-NUMBER-YOU-LIKE yourexefile.exe
.Respostas:
A menos que seu ambiente de linguagem suporte a otimização de chamada final (e sua recursão seja uma chamada final), uma regra básica básica é: a profundidade da recursão deve ser garantida como O (log n), ou seja, usando algoritmos ou estruturas de dados baseadas em dividir e - conquistar (como árvores, a maioria dos alogoritmos de classificação, etc.) é bom, mas qualquer coisa linear (como implementações recursivas de manipulação de lista vinculada) não é.
fonte
Por padrão, o CLR aloca 1 MB para a pilha para cada thread (consulte este artigo ). Portanto, são necessárias muitas chamadas para exceder esse valor. Isso varia dependendo de quanto espaço na pilha cada chamada está usando para itens como parâmetros e variáveis locais.
Você pode até fazer
StackOverflowException
uma ligação com uma única ligação se estiver disposto a ser um pouco ortodoxo:fonte
Como Cole Campbell notou o tamanho da memória e Michael Borgwardt notou a otimização da chamada de cauda , não os abordarei.
Outra coisa a ter em atenção é o CPS, que pode ser usado para otimizar várias funções entrelaçadas, onde a otimização da chamada de cauda é para funções únicas.
Você pode aumentar o tamanho da pilha como fizemos aqui e esteja ciente de que o código de 64 bits consome a pilha mais rapidamente que o código de 32 bits.
É importante notar que executamos um dos exemplos em F # interativo por mais de 40 horas sem explodir a pilha. Sim, foi uma chamada de função executada por si só continuamente até a conclusão bem-sucedida.
Além disso, se você precisar fazer uma cobertura de código para descobrir onde os problemas ocorrem e não tiver cobertura de código com o VS, você pode usar, TestDriven.NET
fonte