我最近写过SEC算法(就像这里http://18.7.29.232/bitstream/handle/1721.1/4015/HPCES024.pdf?sequence=2
)。在第一个递归版本,它似乎抛出超过200000点的“堆栈溢出”异常。我不知道为什么直到我把它写在我自己的堆栈上(使用迭代而不是递归)并且它在1000000点上运行良好。
我相信当我调用函数时,处理器和变量的指令被复制到一些“随机”分配的内存中。我还想,当我有一个类向量的全局变量时,它需要有一些紧凑的内存(如表)。
问题是当我有大量的函数调用时(例如在一些递归算法中),因为(在我看来)当内存被分成小部分时,向量不能“放大”并抛出“堆栈溢出”异常。
所以我认为我可以以某种方式说服c ++应该存储函数实例内存。像这里http://www.parashift.com/c++-faq-lite/placement-new.html制作一些“函数实例”表,所以它不会弄乱内存。
有可能吗?
答案 0 :(得分:0)
永远不会出现堆栈溢出错误的vector
。 vector
在堆上分配它的内存,它可以达到总内存(包括虚拟内存)的大小。
当你调用一个函数时,这些是写在堆栈上的一些数据:
根据架构/编译器,可能还有其他数据。
因此,即使最简单的函数也会在堆栈上占用最少量的内存来调用。幸运的是,当函数返回时,这些内存再次可用。但是,虽然此函数尚未返回,但这些数据仍然存在。因此,如果您一遍又一遍地递归调用函数,则所有这些数据都会相互堆叠。如果你没有尽快结束你的递归函数,你将会耗尽内存,你将收到堆栈溢出错误。
如果您感到好奇,可以在函数中添加额外的变量(确保它们没有得到优化),并且看到以较少的点数得到此错误。
您的解决方案,其他人在评论中说过,因此使用迭代方法,基本上使用std::stack
模拟调用堆栈。