如何基于表驱动设计一个易于实现的简单状态机?
- 内容介绍
- 文章标签
- 相关推荐
本文共计905个文字,预计阅读时间需要4分钟。
表驱动状态机的核心是将当前状态+事件→下一状态+动作固化成一张查表结构。避免使用std::map或嵌套std::vector,它们在嵌套或高频调用场景下容易触发动态分配和内存分配,不利于动态状态分配和缓存。直接使用二维C风格数组或std::array更稳定:
enum class State { Idle, Running, Paused }; enum class Event { Start, Stop, Pause, Resume }; <p>// 静态表:[state][event] → next state constexpr std::array<std::array<State, 4>, 3> transition_table = {{ {{ State::Running, State::Idle, State::Idle, State::Idle }}, // Idle {{ State::Running, State::Idle, State::Paused, State::Running}}, // Running {{ State::Running, State::Idle, State::Paused, State::Running}}, // Paused }};</p>
注意:索引必须严格对齐,State 和 Event 的枚举值要从 0 开始连续定义,否则下标越界不报错但行为不可控。
动作函数怎么挂进表里才安全
纯状态跳转不够,多数场景需要伴随动作(比如进入 Running 时启动定时器)。
本文共计905个文字,预计阅读时间需要4分钟。
表驱动状态机的核心是将当前状态+事件→下一状态+动作固化成一张查表结构。避免使用std::map或嵌套std::vector,它们在嵌套或高频调用场景下容易触发动态分配和内存分配,不利于动态状态分配和缓存。直接使用二维C风格数组或std::array更稳定:
enum class State { Idle, Running, Paused }; enum class Event { Start, Stop, Pause, Resume }; <p>// 静态表:[state][event] → next state constexpr std::array<std::array<State, 4>, 3> transition_table = {{ {{ State::Running, State::Idle, State::Idle, State::Idle }}, // Idle {{ State::Running, State::Idle, State::Paused, State::Running}}, // Running {{ State::Running, State::Idle, State::Paused, State::Running}}, // Paused }};</p>
注意:索引必须严格对齐,State 和 Event 的枚举值要从 0 开始连续定义,否则下标越界不报错但行为不可控。
动作函数怎么挂进表里才安全
纯状态跳转不够,多数场景需要伴随动作(比如进入 Running 时启动定时器)。

