【发布时间】:2012-06-26 08:08:46
【问题描述】:
我正在尝试用 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 的传统方法是使用枚举作为状态和基于开关的调度程序循环,因此与基于函数指针的实现相比,会有一个间接级别。
但我不确定,指令缓存或分支预测是否存在一些问题?换句话说,是否存在可以胜过我的解决方案的实现?
谢谢。
【问题讨论】:
-
我闻到微优化的味道了吗?状态机每毫秒需要运行多少次?
-
@Seva Alekseyev 一些状态相对较大且速度较慢,但有些状态非常小且简单。当 FSM 处于“大”状态之一时,性能并不重要,但必须尽可能快地执行小状态。
-
如果您希望它更快,请使用 one-hot 编码状态机。你过早的优化不会有很长的路要走。你最好写出可读、可维护和可扩展的代码。此外,对于 C++ - boost.org/doc/libs/1_49_0/libs/statechart/doc/index.html
标签: c function-pointers fsm