FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++での簡易コルーチン

switch-caseを利用した、C++での簡易コルーチン。
元ネタはboostのcoroutine.hpp
とか書くと、func1() は 1,2,3,0,0… を順次返す関数に、func2()はa,b,c,a,b,c,…を出力し続ける関数になる。
ローカル変数の保持はできないので、本物(?)のコルーチンと比べて使い勝手が悪いけど
・ポータビリティがある
switch-caseしか使ってないので、インラインアセンブラが使えないorコンテキストにアクセスする手段が無いような環境でも使える。
・コンテキストの保存に4byte(sizeof(int))しか食わない
というメリットがある。
例外やネストに未対応。
__COUNTER__を使うことを試みたり、___base___を減算しているのは、0から始まる連続した数値によるcaseのほうがコンパイラによる最適化が期待できる為。
例外で抜け、再度突入した場合は前回の状態からスタートしてしまう。
intを状態の保存に使っているけど、これをclassに変えて、デストラクタで値を操作するようにすれば、例外で抜けた場合にも対応できる。

何に使えるかというと、たとえばある非同期処理があって、その非同期処理の終了がコールバックで帰ってくる、なんてときに1関数内に連続して処理を記述できるのでソースコードの見通しがかなり良くなる。
非同期処理に限らず、逐次的な処理と、その逐次的な処理と処理の間に別の処理を挟む必要があるものに使える。
下記は、処理A->非同期処理->処理B と書いた場合の例。普通に書いた場合だと処理の数が増えたり分岐が複雑になると、関数&コールバックが増えすぎてgotoだらけのヤバイコードと大差ないものになったりする。

普通に書いた場合:コルーチン使った場合:
スポンサーサイト

コメントの投稿

非公開コメント

検索フォーム
ユーザータグ

ICPC 2009 国内予選 ゲームプログラミング 

カテゴリ
最新記事
月別アーカイブ
最新コメント
最新トラックバック
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。