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



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

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

文档指出,在"非常深或无限的递归"期间会发生这样的异常,所以这当然是可能的,或者 .NET 框架是否为我们动态处理堆栈大小?

我的问题可以总结如下:

是否有可能拥有如此精心设计的程序(在 小的可重用方法的条款),这是增加 堆栈大小,从而使用更多资源?

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

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

它不会在将逻辑分解为方法中。

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

不是真的。我刚刚做了一个非常快速的测试,在 15,000 次嵌套调用后会出现 StackOverflowException。

由于您拥有的方法数量众多,您不可能编写非递归嵌套 15,000 次的代码。

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

在托管世界中,堆栈对性能具有特殊作用。如果您设法在堆栈上分配某些内容(使用原语或结构),则不必将其放在堆上。在堆上分配会增加 GC 压力,这平均会减慢程序的速度。

因此,我可以通过在堆栈上分配大量内容来想象一个更快的程序。甚至使用 stackalloc(这是 C#/CLR 中一个鲜为人知的功能)。

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

最新更新