Здравствуйте, Уважаемый Slav!
Fri Jul 07 2006 10:13, Slav Matveev wrote to Olga Nonova:
ON>> Вот-вот, уже чувствуете "накладные расходы" переходов по таблице.
SM> Вам шашечки или ехать?
Просто обращаю Ваше внимание на недостатки табличного метода, когда выражение при switch дает хоть и целые, но не из натурального ряда значения. И эта ситуация не высосана из пальца, как тут пытаются представить некоторые- (см. мой пример хранения кода состояния в регистре порта вывода).
SM>>> А ваша схема не очень хорошо будет работать когда состояния SM>>> надо будет куда-либо передавать или принимать, например. SM>>> Адрес функции в этом случае не самая лучшая константа, SM>>> по-моему.
ON>> Чем плоха? Она в тексте программы точно такой же имеет всем понятное ON>> символическое имя. Програмисту даже не нужно знать, какой конкретно ON>> это будет физический адрес.
SM> А за текстом? SM> что бы, например process->getstatus() вернул константу, SM> а не абстрактное 0x12345678.
Вы ведете речь о распределенных в сети процессах? Или, все-же о поцессах внутри одного девайса с одним микроконтроллером? В последнем случае, наиболее эхотажном, никто не запрещает передавать символьные имена функций и конечных автоматов между модулями обычной директивой extern.
ON>> Зато, еще раз повторяю, -1. нет никаких ON>> ограничений на тип выражения при switch,
SM> А много-ли у вас таких типов?
В конечном счете один- целое. Hо! Оно не из ряда 0,1,2...
ON>> да и самого switch - тоже нет. -2.работает с максимальной скоростью ON>> ветвления через indirect jmp-ы,
SM> работает через call и приводит к необходимости сохранять- SM> восстанавливать окружение.
Обращаю внимание- происходит вызов процедур без параметров, которые также ничего не возвращают. Приличный компилятор поймет, что "сохранять- восстанавливать окружение"- излишнее занятие. Hапример, С-компилятор IAR для AVR в этом случае просто вставляет ОДHУ команду icall. Правда проигрыш в скорости по сранению с ijmp все-же есть за счет ret из подпрограммы состояния. Hо если родить макрос ветвления с использованием ассемблерного текста, в котором будет именно indirect jmp, то быстрее уже ничего не придумаешь.
SM> табличный jmp на соответствуюие case'ы ничего не сохраняет, SM> а do_something легко описывается как inline.
"do_something" не обсуждается, т.к. одинаково в любом случае.
ON>> -3. никаких переборов case-ов, а значит - фиксированное время ON>> на ветвление по состояниям, что очень важно, например, для генерации ON>> временной последовательности кодов.
SM> Ветвление вы все равно получите, если только у вас SM> не последовательный перебор состояний от начального SM> к конечному.
Ветвление конечно получу, но оно будет занимать всегда фиксированное время. В отличие от switch-case-break с непредсказуемым по времени перебором, когда case-ы отнюдь не 0,1,2...
Всего Вам Хорошего Ольга