我试图在C中实现有限状态机,并且需要它非常快速。 所以我决定用函数指针为 “国”:有限状态机实现
void *state1(void){ /* function body here */ }
void *state2(void){ /* ... */ }
void *state3(void){ /* ... */ }
然后,主FSM循环可以很简单:
void *(*fp)(void);
fp = state1;
while(fp)
fp = fp();
有一个问题:
1)它是可能避免在函数返回类型中使用void指针?理想情况下,状态函数应该有一些类型定义的类型,以确保在FSM中只能使用这种类型的函数。
2)在C语言中实现FSM的传统方法是使用enum进行状态和基于开关的调度器循环,因此与基于函数指针的实现相比,会有一个间接级别。
但我不确定,那里的指令缓存或分支预测有一些问题吗?换句话说,是否存在可以超越我的解决方案的实现?
谢谢。
我有闻到微型优化吗?状态机需要运行几毫秒? –
@Seva Alekseyev有些州比较大而且速度慢,但有些非常小而且简单。当FSM处于“大”状态之一时,性能并不重要,但小型状态必须尽可能快地执行。 –
如果您希望速度更快,请使用单热编码状态机。你过早的优化不会很长。你最好编写可读,可维护和可扩展的代码。另外,对于C++ - http://www.boost.org/doc/libs/1_49_0/libs/statechart/doc/index.html – 2012-06-25 04:08:12