私が理解しているように、コルーチンは関数呼び出しのシーケンスですが、関数呼び出しは各呼び出しをスタックに割り当てない(停止した時点で再開されます)か、またはこれらの関数が共有スタック。コルーチンC++インライン関数との違いは何ですか?
したがって、コルーチンの主な利点は実行速度です。 C++のインライン関数だけではありませんか? (コールの代わりにコンパイル時に関数本体が挿入された場合)。
私が理解しているように、コルーチンは関数呼び出しのシーケンスですが、関数呼び出しは各呼び出しをスタックに割り当てない(停止した時点で再開されます)か、またはこれらの関数が共有スタック。コルーチンC++インライン関数との違いは何ですか?
したがって、コルーチンの主な利点は実行速度です。 C++のインライン関数だけではありませんか? (コールの代わりにコンパイル時に関数本体が挿入された場合)。
「コルーチン」は、一般的に使用される意味では、基本的には、開始されたばかりの呼び出し元と並行して実行されることが想定される機能です。つまり、コルーチンが「利回り」(半特殊なリターン)の場合、必ずしも実行されるわけではありません。また、「呼び出し」は、コルーチンがすべての状態をそのまま維持したままで終了します最初から始めるよりむしろ。したがって、呼び出しは、2つの関数の間でちょっとしたメッセージを渡すものとして見ることができます。
これを完全にネイティブに行う言語はほとんどありません。 (スタックベースの言語は、Windowsの "ファイバー"のような機能を欠いているので、それに苦労する傾向があります。)Rubyは、明らかに、Pythonは限られたバージョンを使用しています。私は彼らが "ジェネレータ"と呼んでいると思うし、iterableコレクション(そのイテレータはその次の "要素"をオンザフライで生成する)のように基本的に使用されている。 C#はそれをセミコロンで行うこともできます(彼らはそれを「反復子」と呼んでいます)が、コンパイラは実際に関数をソートの状態マシンを実装するクラスに変えます。
これの利点は何ですか?この関数呼び出しでクラスを作成し、その状態を保存しないでください。 –
@Alex:言語がコルーチンをサポートしている場合、その必要はない追加コードです。私が言ったように、C#は実際には正確にそうしています - 'yield return 'ステートメントを含む関数を、' switch'ステートメントを使って呼び出しの間に状態を保存し、右の再開ポイントにジャンプするクラスに変換します。関数を呼び出すと 'IEnumerable'が返され、列挙子から次の値を取得するたびに「再開」します。あなたはあなた自身のような何かをすることができますが、言語があなたのためにそれをするなら、どうしてですか? :) – cHao