我目前正在开发一个递归程序来处理不同大小的数据集。
我发现的问题是,使用我最大的数据集(大约350,000条记录),我的程序似乎在没有提供任何错误信息的情况下终止。
从测试中我认为这可能是由于递归导致太多不完整的方法打开(粗略计数为72756)。所以我的问题是,C ++对活动方法的数量有限制,还是我在看错了问题?
答案 0 :(得分:1)
C ++作为一种语言没有。但是,C ++的真正实现总是有一个限制,并且你使用足够深度的递归来确保堆栈空间不足。
至少马上就是这样,听起来像递归可能是一份糟糕的选择,尽管你给出的描述很少,但说起来有点难。
答案 1 :(得分:1)
从语言的角度来看没有特别的限制。但是,所有实现都受可用资源的限制。
如果你有非常深的递归,你可能会用完堆栈空间。检查编译器/链接器设置以请求额外空间。
答案 2 :(得分:1)
递归深度是有限的,如果这就是你所要求的。每次调用函数时,都需要更多的空间来保存函数的参数和局部变量。从该函数返回之前,此堆栈空间不会被重用。 如果你正在递归70k级,我会相信你的堆栈空间不足。根据操作系统/线程,堆栈空间相对有限,并且很难以可移植的方式增加它。 您可能必须使用堆栈数据结构(STL有一个)而不使用递归来避免此问题。通过new / malloc分配的内存与堆栈内存没有相同的限制,因此您可以分配系统中可用的内存。
答案 3 :(得分:1)
正如已经建议的那样,您可能已经没有堆栈空间,这意味着您正在StackOverflow中运行。你在正确的网站上询问它:)
每次调用函数时,程序都会保留一些堆栈空间来存储调用函数的参数及其局部变量。这很快就会增加,并且深度为72k的方法,你可能会把保留的空间吹掉。
有各种可能的解决方案:
通过优化编译,优化可以通过优化变量来减少堆栈消耗,并更加集中地使用CPU寄存器......因此,您可以为同一个程序消耗更少的空间。
请参阅编译器的文档,应该有一个选项来增加为堆栈保留的内存量。对于gcc,它是-Wl,--stack,<bytes>
(它是一个链接器选项)。对于gcc,默认值是8MiB,但你可以轻松地使用16或32,我们现在不是那么有限。
某些编译器(至少gcc 4.6)有一个-fsplit-stack
。它或多或少是实验性的,但其想法是允许多个部分的堆栈,这些部分随需求增长。如果它有效,它会立即解决您的问题。
还有各种策略来限制源头的问题:
由您决定为您自己的案例找出更实用的解决方案。