如何基于表驱动设计一个易于实现的简单状态机?

2026-04-29 08:481阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计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>

注意:索引必须严格对齐,StateEvent 的枚举值要从 0 开始连续定义,否则下标越界不报错但行为不可控。

动作函数怎么挂进表里才安全

纯状态跳转不够,多数场景需要伴随动作(比如进入 Running 时启动定时器)。

阅读全文
标签:C

本文共计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>

注意:索引必须严格对齐,StateEvent 的枚举值要从 0 开始连续定义,否则下标越界不报错但行为不可控。

动作函数怎么挂进表里才安全

纯状态跳转不够,多数场景需要伴随动作(比如进入 Running 时启动定时器)。

阅读全文
标签:C