C++ 1z Coroutines语言功能?

Laz*_*535 6 c++ coroutine language-extension c++17

为什么协程(现在在C++ 1z的最新草案中)被实现为核心语言功能(花哨的关键字和所有)而不是库扩展?

已经存在一些针对它们的实现(Boost.Coroutine等),其中一些可以与我所阅读的平台无关.为什么委员会决定将其融入核心语言本身?

我不是说他们不应该,但是Bjarne Stroustrup自己在一些谈话中提到过(不知道哪一个),应该尽可能在图书馆中实现新功能,而不是触及核心语言.

那么有充分的理由吗?有什么好处?

Die*_*ühl 7

虽然有协同程序的库实现,但这些协议往往具有特定的限制.例如,库协议实现无法检测协程挂起时需要维护哪些变量.可以解决这种需要,例如,通过以某种形式明确使用变量.但是,当协同程序应尽可能地像正常函数一样时,应该可以定义局部变量.

我不认为Boost协同程序的任何实现者认为他们各自的库接口是理想的.虽然它是目前语言中可以实现的最佳选择,但总体使用可以得到改善.

  • Boost协程基于另一个库:Boost Context,它提供了上下文切换的平台细节.根据我的理解,有一些装配黑客参与实现这一目标.但我不认为局部变量存在问题.它们只是在上下文切换后保留在堆栈中. (2认同)
  • @ Lazarus535:这种方法适用于堆栈协程.还有无堆栈协程需要在其他地方存储使用过的变量.Boost中的无堆栈协同程序使用宏hack(本质上是[Duff的设备](https://en.wikipedia.org/wiki/Duff%27s_device)的变体)以及相关状态的强制基类.无堆布式协程比堆栈协程更有效 - 作为对某些约束的回报. (2认同)

Ati*_*ifm 5

在CppCon 2015上,来自Microsoft的Gor Nishanov提出了这样的论点,即C ++协程可能是负面的开销抽象。他的演讲稿在这里

如果看一下他的示例,使用协程的能力简化了网络代码的控制流程,并且在编译器级别实现时,可以为您提供较小的代码,其吞吐量是原始代码的两倍。他认为,屈服能力实际上应该是C ++函数的功能。

它们在Visual Studio 2015中具有初始实现,因此您可以针对您的用例进行尝试,并查看其与boost实现的比较。看起来他们仍然在尝试使用Async / Yield关键字,因此请注意标准的去向。

对于C ++的可恢复函数建议可以发现这里和更新这里。不幸的是,它没有进入c ++ 17,但现在是技术规范p0057r2。从好的方面来看,它们似乎在使用-fcoroutines_ts标志的clang中得到了支持,在Visual Studio 2015 Update 2中也得到了支持。这些关键字也带有co_前缀。因此,co_await,co_yield等。

协程是golang,D,python,C#的内置功能,并将采用新的Javascript标准(ECMA6)。如果C ++提出了更有效的实现,我想知道它是否会取代golang的采用。