2012-03-31 35 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