我们都知道创建促进重用的小方法是一种好习惯,这不可避免地会导致很多方法被放置在堆栈上。但是,是否有可能达到有这么多嵌套方法调用而发生StackOverflow异常的情况?
接受的解决方案是否只是增加堆栈大小?
documentation states在“非常深或无限递归”期间会出现这样的异常,所以它当然可能,或者.NET框架是否为我们动态处理堆栈大小?
我的问题可以总结如下:
是否有可能拥有这样一个精心设计的程序(in 小的可重用方法的术语),这是增加的必要条件 堆栈大小因此使用更多资源?
答案 0 :(得分:3)
.NET堆栈大小是固定的,默认为1 MB。
是否有可能拥有这样一个设计良好的程序(就可重复使用的小方法而言),这对于增加堆栈大小和使用更多资源是必要的?
它不会将你的逻辑分解为方法。
您遇到不是直接错误的Stack Overflow的唯一方法是使用递归。当发生这种情况(威胁)时,不要增加堆栈,而是重写代码以使用不同的方式来存储数据(如Stack<T>
)。
答案 1 :(得分:2)
不是真的。我刚做了一个非常快速的测试,并且在15,000次嵌套调用之后发生了StackOverflowException。
由于您拥有大量的方法,您无法编写非递归嵌套15,000次的代码。
显然,确切的数字取决于您在堆栈上分配的许多函数局部变量。但无论实际数字是多少,它都远远不足以做你所建议的。
答案 2 :(得分:0)
在托管世界中,堆栈对性能起着特殊的作用。如果您设法在堆栈上分配一些东西(使用原语或结构),则不必将其放在堆上。在堆上分配会增加GC压力,这平均会降低程序的速度。
所以我可以通过在堆栈上分配大量内容来成像更快的程序。即使使用 stackalloc (这是C#/ CLR的一个鲜为人知的功能)。
有效的案例可以做到这一点。它们很少见。只是说“没有有效用途”是完全错误的。