ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
8 мая
1374930 Топик полностью
BlackMorda, мудак (23.11.2023 23:09, просмотров: 176) ответил IBAH на Имеет ли смысл на современных компиляторах, например под АРМ, писать конечные автоматы на switch-case? Или можно через if? Ведь переменная состояния не волитейт, можно и оптимизировать, не вычислять ее перед каждым блоком
Смотря какой смысл закладывать 

Если использовать только "if " то будут проверятся все условия (состояния) в любом случае.


Если использовать "if /else if" то будут проверятся все условия получения истинного значения, а часть ветки будет пропущена - экономия времени.


Можно найти преимущество и в примере https://caxapa.ru/1374845.html

Сразу после перехода в SostDDS=30, проверяется SostDDS с минимальной задержкой.


Eddy_Em пишет:

Ага. Пример: есть у нас состояния 0..10. Мы их в свиче перечислили. Далее gcc видит это, и делает нечто вроде массива адресов перехода (goto label, как говорится). По номеру состояния берет адрес и туда "прыгает", выполняя дальнейший код (а там уже если есть break, будет еще одно goto - в хвост, если же нужен fallthru, пойдет в следующий кейс). - Eddy_Em


Описано похоже, но не совсем так.

Создается таблица смещений от текущего счетчика команд. При этом не обязательно состояния должны быть с нуля

Вот в примере "состояния" с 1 по 6. Компилятор отнял 1 чтобы привести начало диапазона к нулю.

fallthru здесь тоже можно организовать разными смещениями для счетчика команд.

Для "дыр" компилятор может вставить смещение def_8002996 как в примере.


LDRB.W R0, [SP]

SUBS R0, R0, #1 ; switch 6 cases

CMP R0, #5

BHI def_8002996 ; jumptable 08002996 default case

TBB.W [PC,R0] ; switch jump

DATA


DCB 0x11

DCB 0xA

DCB 4

DCB 4

DCB 5

DCB 0xE

Итого: switch/case выглядит в тексте более удобно читаемым и компилятору легче оптимизировать.