Warum wurde C ++ 0x kein Ertrag hinzugefügt?
Ich habe Yield in vielen meiner Python-Programme verwendet und esJa wirklic löscht den Code in vielen Fällen. ICH darüber gebloggt und es ist eine der beliebtesten Seiten meiner Website.
C # bietet auch Rendite - es wird über die Statusverwaltung auf der Aufruferseite implementiert, die über eine automatisch generierte Klasse erfolgt, die den Status, die lokalen Variablen der Funktion usw. beibehält.
Ich lese gerade über C ++ 0x und seine Ergänzungen; und während ich über die Implementierung von Lambdas in C ++ 0x lese, stelle ich fest, dass dies auch über automatisch generierte Klassen erfolgt ist, die mit operator () ausgestattet sind, das den Lambda-Code speichert. Die natürliche Frage, die sich in meinem Kopf stellte, war: Sie taten es für Lambdas, warum betrachteten sie es nicht auch als Unterstützung für "Ertrag"?
Sicher können sie den Wert von Co-Routinen sehen ... also kann ich nur raten, dass sie makrobasierte Implementierungen denken (wie Simon Tatham) als adäquater Ersatz. Sie sind jedoch aus vielen Gründen nicht vorhanden: im Ruhezustand, nicht wiedereintrittsfähig, makrobasiert (das allein ist Grund genug) usw.
Bearbeiten yield
hängt nicht von Speicherbereinigung, Threads oder Fasern ab. Sie können den Artikel von Simon lesen, um zu sehen, dass der Compiler eine einfache Transformation durchführt, z. B .:
int fibonacci() {
int a = 0, b = 1;
while (true) {
yield a;
int c = a + b;
a = b;
b = c;
}
}
In
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;
}
}
}
}
Speicherbereinigung? Fäden? Fasern? Nein, einfache Transformation? Wohl ja.