編集、私がこの質問をした11年後:私は質問したことで立証されたと感じています!C++20はついに十分に近い何かをしました。
元の質問は以下のとおりです。
-
私は多くのPythonプログラムでyieldを使用してきましたが、多くの場合、コードが実際にクリアされます。私はそれについてブログを書きました、そしてそれは私のサイトの人気のあるページの1つです。
C#はyieldも提供します。これは、呼び出し側の状態保持を介して実装され、状態、関数のローカル変数などを保持する自動生成されたクラスを介して実行されます。
私は現在、C++0xとその追加について読んでいます。また、C ++ 0xでのラムダの実装について読んでいると、ラムダコードを格納するoperator()を備えた、自動生成されたクラスを介して行われたことがわかりました。私の頭の中に形成された自然な質問:彼らはラムダのためにそれをしました、なぜ彼らは「収量」のサポートのためにもそれを考慮しなかったのですか?
確かに彼らはコルーチンの価値を見ることができます...だから私は彼らがマクロベースの実装(Simon Tathamのような)を適切な代替物として考えていると推測することができるだけです。ただし、多くの理由でそうではありません。呼び出し先が保持された状態、再入可能でない、マクロベース(それだけで十分な理由)などです。
編集: yield
ガベージコレクション、スレッド、またはファイバーに依存しません。Simonの記事を読んで、次のような単純な変換を行うコンパイラについて話していることがわかります。
int fibonacci() {
int a = 0, b = 1;
while (true) {
yield a;
int c = a + b;
a = b;
b = c;
}
}
の中へ:
struct GeneratedFibonacci {
int state;
int a, b;
GeneratedFibonacci() : state (0), a (0), b (1) {}
int operator()() {
switch (state) {
case 0:
state = 1;
while (true) {
return a;
case 1:
int c = a + b;
a = b;
b = c;
}
}
}
}
ガベージコレクション?いいえ、スレッドですか?いいえ。繊維?いいえ。単純な変換ですか?間違いなく、はい。