是否有可能在堆栈大小和可能的溢出方面有太多方法?

时间:2012-05-13 22:19:52

标签: c# .net design-patterns stack stack-overflow

我们都知道创建促进重用的小方法是一种好习惯,这不可避免地会导致很多方法被放置在堆栈上。但是,是否有可能达到有这么多嵌套方法调用而发生StackOverflow异常的情况?

接受的解决方案是否只是增加堆栈大小?

documentation states在“非常深或无限递归”期间会出现这样的异常,所以它当然可能,或者.NET框架是否为我们动态处理堆栈大小?

我的问题可以总结如下:

  

是否有可能拥有这样一个精心设计的程序(in   小的可重用方法的术语),这是增加的必要条件   堆栈大小因此使用更多资源?

3 个答案:

答案 0 :(得分:3)

.NET堆栈大小是固定的,默认为1 MB。

  

是否有可能拥有这样一个设计良好的程序(就可重复使用的小方法而言),这对于增加堆栈大小和使用更多资源是必要的?

它不会将你的逻辑分解为方法。

您遇到不是直接错误的Stack Overflow的唯一方法是使用递归。当发生这种情况(威胁)时,不要增加堆栈,而是重写代码以使用不同的方式来存储数据(如Stack<T>)。

答案 1 :(得分:2)

不是真的。我刚做了一个非常快速的测试,并且在15,000次嵌套调用之后发生了StackOverflowException。

由于您拥有大量的方法,您无法编写非递归嵌套15,000次的代码。

显然,确切的数字取决于您在堆栈上分配的许多函数局部变量。但无论实际数字是多少,它都远远不足以做你所建议的。

答案 2 :(得分:0)

在托管世界中,堆栈对性能起着特殊的作用。如果您设法在堆栈上分配一些东西(使用原语或结构),则不必将其放在堆上。在堆上分配会增加GC压力,这平均会降低程序的速度。

所以我可以通过在堆栈上分配大量内容来成像更快的程序。即使使用 stackalloc (这是C#/ CLR的一个鲜为人知的功能)。

有效的案例可以做到这一点。它们很少见。只是说“没有有效用途”是完全错误的。