Barnes-Hut 和递归限制

Barnes-Hut and recursion limit

我已经在我的 n 体模拟器中实现了 "Barnes-Hut" 算法,但我遇到了 运行 个问题。

我的程序会崩溃,出现与内存相关的异常,主要是 stack overflow 异常。

使收到此错误成为一个奇怪的错误的原因是它不会在固定时间发生,它似乎是突然出现的。使用任务管理器我可以清楚地看到没有内存泄漏,我一直非常小心地避免这种情况。不过,我确实这样做了,使用递归和对象中的对象。

我是否可能需要包含八叉树的最大深度,这就是导致错误的原因?

最大递归深度确实受到堆栈大小的限制。
堆栈大小 与您的完整 RAM 内存大小不同
例如。在 Windows 上,默认堆栈大小(每个线程)为 1MB,仅此而已。

可以为您的程序重新配置它,and/or 到 "catch" 堆栈溢出错误而不会使整个程序崩溃(后者相当脏,但至少是可能的)。

尽管如此,最好的解决方案是修改代码以摆脱该递归。所有递归都可以用迭代解决方案代替,但它可能会更复杂一些。并且每个函数调用的数据都可以移动到一个vector等,每次调用一个条目,这样动态分配的向量内存就可以使用整个RAM。