我应该避免在 iPhone 上递归吗?

Posted

技术标签:

【中文标题】我应该避免在 iPhone 上递归吗?【英文标题】:Should I avoid recursion on the iPhone? 【发布时间】:2010-10-15 20:48:57 【问题描述】:

我应该避免使用在 iPhone 上运行的代码进行递归吗?

或者换一种说法,有没有人知道 iphone 上的最大堆栈大小?

【问题讨论】:

(在这里插入一个关于电话本身的愚蠢笑话) 【参考方案1】:

是的,避免递归在所有嵌入式平台上都是一件好事。

它不仅降低甚至消除了堆栈溢出的可能性,而且通常还可以为您提供更快的代码。

您始终可以将递归算法重写为迭代。不过,这并不总是实用的(想想快速排序)。解决此问题的一种方法是以限制递归深度的方式重写算法。

introsort 是一个很好的例子,它是如何在实践中完成的。它将快速排序的递归深度限制为 log2(元素数)。所以在 32 位机器上,你的递归永远不会超过 32。

http://en.wikipedia.org/wiki/Introsort

我过去曾为嵌入式平台(汽车娱乐系统、电话、游戏机等)编写过很多软件,并且我始终确保为递归深度设置上限或避免递归首先。

因此,我的所有程序都没有因堆栈溢出而死机,大多数程序都对 32kb 的堆栈感到满意。一旦您需要多个线程,这将带来巨大的回报,因为每个线程都有自己的堆栈。您可以通过这种方式节省数兆字节的内存。

【讨论】:

【参考方案2】:

我看到几个答案归结为“不要使用递归”。我不同意——它不像 iPhone 是一些受到严格限制的嵌入式系统。如果问题本质上是递归的,请随意以这种方式表达。

除非您递归到数百或数千帧的堆栈深度,否则您永远不会遇到问题。

【讨论】:

【参考方案3】:

iphone 上的最大堆栈大小?

iPhone 运行经过修改的 OSX,其中每个进程都被分配了一个有效的内存空间,就像在大多数操作系统中一样。

它是一个完整的处理器,因此堆栈会增大,而堆会减小(反之亦然,具体取决于您的观点)。这意味着在分配给程序的内存用完之前,您不会溢出堆栈。

出于堆栈和性能方面的原因,最好尽量避免递归(函数调用相对于简单循环而言代价高昂),但无论如何,您都应该决定可以对递归函数施加什么限制,并在它们运行时截断它们太长了。

【讨论】:

以上是关于我应该避免在 iPhone 上递归吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在 iPhone 应用程序上拉下屏幕

iPhone:在对象上调用释放:它会立即释放吗?

iPhone 4.0 在 iPad 上构建

避免多个 NSManagedObjectContexts 之间的无限递归同步

iPhone/iPad 的 HTML 单位

最新的 iPhone SDK 3.2 BETA 合二为一吗?