Tonal
> Без рекурсии, все внутри одной функции, с использованием аппаратного стека.
Аппаратного стека на IBM PC не существует.
А вообще - без рекурсии, естественно, будет быстрее. И в стек меньше пишется, и не сбрасывается конвейер при вызове процедуры. Вот только нет уверенности, что это существенно скажется на производительности.
Если процедура состоит из одной строки, то за счет отказа от вызова можно выиграть почти порядок. Если из десятка строк - порядка вдвое. Если в процедуре несколько десятков строк, выигрыш вряд ли окажется существенным.
Если уж очень волнует производительность, можно реализовать оба варианта и сравнить по скорости.
PS, Лично я, когда потребовалось реализовать AVL-дерево, предпочел рекурсию.
andriano
> Аппаратного стека на IBM PC не существует.
ёу!
innuendo
> ёу!
А что, есть какие-то сомнения?
Может, сомневающийся укажет, какова максимальная глубина этого стека?
Например, микроконтроллер PIC17CXXX содержит 16-уровневый аппаратный стек, а PIC18CXXX - 31-уровневый.
andriano
andriano
> Например, микроконтроллер PIC17CXXX содержит 16-уровневый аппаратный стек, а
> PIC18CXXX - 31-уровневый.
и как можно с этим аппаратным работать ? через push\pop команды или как ?
innuendo
Вообще-то контроллер достаточно слабенький и узко специализированный. С системой его команд я не разбирался, не удивлюсь, если единственными командами работы со стеком будут call и ret.
Кстати, подобные архитектуры обычно не соответствуют фон-нейману и имеют физически изолированные друг от друга не только стек, но и память для команд и память для данных.
Соответственно, и смешение команд с данными в стеке также не допускается.
На то он и аппаратный, что с ним нельзя работать из программы.
aRpi
Если написать
void f() { char stack[100]; register int top=0; // ... }
, то это будет работать на том же аппаратном стеке безо всякого ассемблера. Но не думаю, что заморачиваться имеет смысл.
andriano
> С системой его команд я не разбирался, не удивлюсь, если единственными
> командами работы со стеком будут call и ret.
вот мне интересно, если я могу сделать push eax и что-то положется в память и даже esp уменьшится - это аппапатный стек или програмный ?
я вот младший скриптёр, поэтому и спрашиваю :)
и ради какой же интересной, реальной задачи усе это мозготратство?...
и до сих пор - ни цифров, ни тестов... ни приложений полезных...
т.е. прям сплошные ответы на вопрос как вы думаете?
так, этак и растак... и еще вот так... а как оно есть на самом деле - способны проявить лишь натурные испытания... но это никому не интересно наверное...
да и с какой стати, опять же - сферический конь нужен видимо... ни тебе постановки четкой, ни описания хотя бы в теории - где это было бы реально полезно: т.е. несло бы заметный выигрыш по скорости... ведь надо хоть както компенсировать упавшую простоту... и оправдать этот великосветский симпозиум))) - ни о чем пока...
во пример.... халявный :)
uint32 calc(uint32 a, uint32 d, uint32 n ) { return ( n>0)?( a + calc( a+d,d,n-1) ): 0 ; }
uint32 calc(uint32 a, uint32 d, uint32 n ) { if( n>0 ) return ( ( ( a<<1)+d*( n-1))*n)>>1; else return 0; }
на кой нужен?
нам интересно как-начем-мы программим?
или что?
где реальный выход всякой красоты?
innuendo
> вот мне интересно, если я могу сделать push eax и что-то положется в память и
> даже esp уменьшится - это аппапатный стек или програмный ?
> я вот младший скриптёр, поэтому и спрашиваю :)
Еще раз: аппаратный стек - изолированная область памяти, не входящая в общее адресное пространство. Бывает только на машинах не-фоннеймановской архитектуры.
Программный стек - обычно полностью реализуется в программе.
Стек в машинах с фоннеймановской архитектурой, естественно, расположенный в общей памяти и общем адресном пространстве, - это просто стек. К нему не применяются определения "программный" или "аппаратный".
andriano
> Еще раз: аппаратный стек - изолированная область памяти, не входящая в общее
> адресное пространство
это где такое определение ?
не пойдёт ?
http://www.intuit.ru/department/se/pbmsu/6/4.html
innuendo
> не волнуйся, тебе сейчас подробно расскажут - чего ты не знаешь :)
innuendo
> это где такое определение ?
>
> не пойдёт ?
> http://www.intuit.ru/department/se/pbmsu/6/4.html
>
>
Это надо читать книжки по архитектуре ЭВМ (а не архитектуре IBM PC). Вероятно, следует обращать внимание на гарвардскую архитектуру.
Очевидно, автор материала по приведенной ссылке просто не знает, что существуют какие-то еще архитектуры кроме фон-неймановской, поэтому и неправильно использует термин, смысла которого не знает.
Собственно, фразы:
> Аппаратный стек реализуется на базе оперативной памяти.
и
> адрес элемента в вершине стека.
говорят, что речь идет не об аппаратном стеке, а о сегменте стека в оперативной памяти, т.к. аппаратный стек реализуется вне пределов оперативной памяти и, соответственно, не имеет адресов.
Но сейчас посмотрел поиском - действительно, нашел несколько мест, где при описании IBM PC фигурирует термин "аппаратный стек". Впрочем, как показывает практика, ошибки распространяются в Интернет с завидной скоростью.
andriano
устроим голосование ? :)
Тема в архиве.