我試圖在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