编辑,在我问这个问题 11 年后:我觉得问这个问题是正确的!C++20 终于做了足够接近的事情。
原始问题如下。
--
我一直在我的许多 Python 程序中使用 yield,它确实在许多情况下清除了代码。我写了一篇关于它的博客,它是我网站的热门页面之一。
C#还提供yield——它是通过调用方的状态保持来实现的,通过一个自动生成的类来保持状态、函数的局部变量等。
我目前正在阅读有关 C++0x 及其添加的内容;在阅读 C++0x 中 lambdas 的实现时,我发现它也是通过自动生成的类完成的,配备了 operator() 存储 lambda 代码。我脑海中自然形成了一个问题:他们是为 lambdas 做的,为什么他们不考虑支持“收益”呢?
当然,他们可以看到协同程序的价值......所以我只能猜测他们认为基于宏的实现(例如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;
}
}
}
}
垃圾收集?不,线程?不,纤维?不,简单的转变?可以说,是的。