Я пытаюсь реализовать конечный автомат на C, и мне нужно, чтобы он был очень быстрым. Поэтому я решил использовать указатели на функции как «состояния»:
void *state1(void){ /* function body here */ }
void *state2(void){ /* ... */ }
void *state3(void){ /* ... */ }
Тогда основной цикл конечного автомата может быть очень простым:
void *(*fp)(void);
fp = state1;
while(fp)
fp = fp();
Есть вопросы:
1) Можно ли избежать использования указателя void в типах возвращаемых функций? В идеале функции состояния должны иметь определенный тип, чтобы гарантировать, что в FSM будут использоваться только функции с этим типом.
2) Традиционный подход к реализации конечного автомата в C использует перечисление для состояний и цикл диспетчера на основе переключателей, поэтому по сравнению с реализацией на основе указателей функций будет один уровень косвенности.
Но я не уверен, могут ли быть какие-то проблемы с кешем инструкций или предсказанием переходов? Другими словами, может ли существовать реализация, которая может превзойти мое решение?
Спасибо.