Должен ли я избежать рекурсии на iPhone? - PullRequest
4 голосов
/ 27 марта 2009

Стоит ли избегать рекурсии с кодом, который работает на iPhone?

Или, другими словами, кто-нибудь знает максимальный размер стека на iphone?

Ответы [ 3 ]

3 голосов
/ 27 марта 2009

Да, избегать рекурсии хорошо на всех встроенных платформах.

Он не только снижает или даже устраняет вероятность переполнения стека, но также часто дает более быстрый код.

Вы всегда можете переписать рекурсивный алгоритм для повторения. Это не всегда практично (подумайте о быстрой сортировке). Один из способов обойти это - переписать алгоритмы так, чтобы глубина рекурсии была ограничена.

Интросорт - прекрасный пример того, как это делается на практике. Он ограничивает глубину рекурсии быстрой сортировки до log2 (количество элементов). Так что на 32-битной машине вы никогда не вернетесь глубже, чем 32.

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

В прошлом я написал немало программного обеспечения для встраиваемых платформ (автомобильные развлекательные системы, телефоны, игровые приставки и т. П.), И я всегда следил за тем, чтобы установить верхний предел глубины рекурсии или избежать рекурсии в первую очередь.

В результате ни одна из моих программ никогда не умерла с переполнением стека, и большинство программ довольны размером стека 32 КБ. Это окупается, когда вам нужно несколько потоков, поскольку каждый поток получает свой собственный стек. Таким образом, вы можете сэкономить мегабайты памяти.

2 голосов
/ 01 апреля 2009

Я вижу пару ответов, которые сводятся к "не использовать рекурсию". Я не согласен - это не значит, что iPhone - это какая-то жестко ограниченная встроенная система. Если проблема по своей сути рекурсивная, не стесняйтесь выражать ее таким образом.

Если вы не вернетесь к глубине стека в сотни или тысячи кадров, у вас никогда не возникнет проблем.

1 голос
/ 27 марта 2009

Максимальный размер стека на iphone?

В iPhone работает модифицированный OSX, в котором каждому процессу предоставляется допустимое пространство памяти, как и в большинстве операционных систем.

Это полноценный процессор, поэтому стек увеличивается, а куча уменьшается (или наоборот, в зависимости от вашей перспективы). Это означает, что вы не переполните стек, пока не исчерпаете память, выделенную вашей программе.

Лучше избегать рекурсии, когда это возможно из соображений стека и производительности (вызовы функций дороги по сравнению с простыми циклами), но в любом случае вы должны решить, какие ограничения вы можете установить для рекурсивных функций, и обрезать их, если они идут слишком долго.

...