当我用 C# 编写一些代码时,我有一个递归方法,在调用几千次后导致堆栈溢出异常。
所以过了一段时间,我用 C++ 编写了相同的代码,它运行良好,没有任何异常(即使递归调用的实际数量比 C# 停止的地方多大约 10 倍)。
C# 和 C++ 在处理这个问题上有什么区别?有什么方法可以允许在 C# 中进行更多递归调用而不抛出异常?
最佳答案
C# 和 C++ 中 stackoverflow 最显着的区别是:C++ 没有“堆栈溢出异常”(*)。使用 C++ 溢出堆栈的结果只是未定义的行为。它可能会做您期望它做的事情,但也可能会做一些完全不同的事情。如果幸运的话,程序会崩溃(由于在堆栈末尾分配了一个 protected 页面而导致分段冲突),如果运气不好,直到在某个时候尝试访问现在被覆盖的内存时,才会检测到 stackoverflow .
其他可能影响递归调用的因素:
- 可用的筹码量可能不同。
- 使用的堆栈帧的大小可能不同。
- 尾递归优化可以在一种情况下进行,但不能在另一种情况下进行。
- 一些系统能够动态增加它们的堆栈(“拆分堆栈”)。
(*) 由于行为未定义,某些实现可能会定义一个 stackoverflow 异常并在适当的条件下抛出该异常;但是,没有这样的保证。
关于c# - c++和c#在栈溢出异常方面的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37527350/