2012-03-31 62 views
0

正如我所理解的那样,协程是一系列函数调用,区别在于函数调用不会为每个调用分配堆栈(它们是针对它们被停用的点而被恢复的),或者我们可以说这些函数是在共享中执行的叠加。协程与C++内联函数有什么不同?

所以协程的主要优点是执行速度。它不仅仅是C++的内联函数吗? (而不是调用时,函数体在编译期间被插入)。

回答

3

一个常用意义上的“协同程序”,基本上是一个功能,一旦开始 - 可以设想为与主叫方一起运行。也就是说,当协程“yield”(一种半特殊的返回)时,它不一定完成 - 再次“调用”它将使协程正确地停止,并保持其状态完好而不是从一开始就开始。这些调用可以被看作是在两个函数之间传递消息。

很少有语言完全和本机做到这一点。 (基于堆栈的语言往往很难用它,缺少像Windows的“纤维”这样的功能。)Ruby显然是这样做的,Python使用它的一个有限版本。我相信他们把它称为“生成器”,它基本上就像一个可迭代集合(其迭代器在运行中生成其下一个“元素”)。 C#也可以做到这一点(他们称之为“迭代器”),但编译器实际上将函数转换为实现了各种状态机的类。

+0

这有什么优势?为什么不用这个函数调用创建类并存储它的状态。 – 2012-03-31 06:34:47

+3

@Alex:如果语言支持协程,则额外的代码不需要存在。就像我所说的那样,C#实际上就是这么做的 - 它将一个包含“yield return”语句的函数转换为一个类,该类存储调用之间的状态并通过switch语句跳转到正确的恢复点。调用该函数将返回一个“IEnumerable”,并且每次从枚举器获取下一个值时,它都会“恢复”。你可以自己做这样的事情,但是如果这种语言会为你做......为什么不呢? :) – cHao 2012-03-31 06:38:17