C++1z 协程是一种语言功能

C++1z Coroutines a language feature?

本文关键字:一种 语言 功能 C++1z      更新时间:2023-10-16

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

已经存在一些实现(Boost.Coroutine等(,其中一些可以独立于平台,从我所读到的内容来看。为什么委员会决定将其烘焙到核心语言本身中?

我并不是说他们不应该,但 Bjarne Stroustrup 本人在一些演讲中提到(不知道是哪一个了(,新功能应该尽可能在库中实现,而不是触及核心语言。

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

虽然有协程的库实现,但这些往往有特定的限制。例如,库实现无法检测在暂停协程时需要维护哪些变量。可以解决这种需求,例如,通过以某种形式明确使用变量。但是,当协程的行为应尽可能像普通函数时,应该可以定义局部变量。

我不认为任何 Boost 协程的实现者认为他们各自的库接口是理想的。虽然这是当前语言中可以实现的最佳效果,但整体使用可以改进。

在 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的采用。

来自 C++1z 的可恢复函数支持无堆栈上下文切换,而 boost.coroutine(2( 提供堆栈完整上下文切换。

不同之处在于,使用堆叠上下文切换时,协程中调用的函数的堆栈帧在挂起上下文时保持不变,而在挂起可恢复功能时删除子路由的堆栈帧 (C++1z(。