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