C++ 状态机编程:原理、实现与优化
1. C++ 成员函数指针的挑战
在 C++ 状态处理函数中,通常会使用本类类型的 “me” 指针来访问状态机的数据成员和成员函数。这是因为状态处理函数是 QHsm 子类(如计算器状态机类 Calc)的静态成员。
一种更优雅的替代方案是将状态处理函数设为常规的非静态类成员,这样就能通过隐式的 “this” 指针更自然地访问类成员。早期的 QEP/C++ 版本就采用了这种方案,但在实践中却出现了问题。虽然该版本以相当标准的方式使用成员函数指针,但嵌入式开发者反馈,这种优雅的方法要么性能极差,要么根本无法工作。例如,一些嵌入式 C++ 编译器解引用成员函数指针需要 30 多条机器指令,而解引用普通函数指针只需三条。
许多 C++ 编译器由于受多重继承和虚拟基类等语言特性的干扰,对成员函数指针的支持不佳。像 MFC 这样广泛使用的重要框架,实际上也以非标准的方式使用成员函数指针,绕过了正常的 C++ 类型检查。
为避免效率低下和可移植性问题,当前的 QEP C++ 版本不使用成员函数指针,而是使用指向静态成员函数的普通函数指针。静态类成员所需的显式 “me” 指针,与面向对象状态设计模式所需的 “context” 指针作用相同。
2. 分层状态机类
分层状态机类(Hierarchical State Machine Class)是 QEP 设计的核心元素,它负责跟踪当前的活动状态。状态变量是一个指向之前定义的状态处理函数 QStateHandler 的指针。QHsm 类还提供了标准的状态机接口函数 init() 和 dispatch(),以及构造函数和顶级状态处理函数。
<
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



