C++1z Coroutines 是一种语言特性吗?

C++1z Coroutines a language feature?

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

它们已经存在一些实现(Boost.Coroutine,等等),据我所读,其中一些可以独立于平台。为什么委员会决定将其融入核心语言本身?

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

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

虽然有协程的库实现,但它们往往有特定的限制。例如,库实现无法检测协程挂起时需要维护哪些变量。可以解决此需求,例如,通过以某种形式显式使用变量。但是,当协程应该尽可能表现得像普通函数时,应该可以定义局部变量。

我认为没有任何 Boost 协程的实现者认为他们各自的库接口是理想的。虽然是目前语言所能做到的最好的,但整体的使用还是有待提高的。

在 CppCon 2015 上,Microsoft 的 Gor Nishanov 提出了 C++ 协程可以 a negative overhead abstraction. The paper from his talk is here 的论点。

如果你看一下他的例子,使用协程的能力简化了网络代码的控制流,当在编译器级别实现时,你的代码更小,吞吐量是原始代码的两倍。他认为真正的 yield 能力应该是 C++ 函数的一个特性。

他们在 Visual Studio 2015 年进行了初步实施,因此您可以针对您的用例尝试一下,看看它与 boost 实施相比如何。看起来他们仍在尝试确定是否会使用 Async/Yield 关键字,因此请密切关注标准的发展方向。

可以找到 C++ 的可恢复函数提案 here and the update here. Unfortunately, it didn't make it into c++17, but is now a technical specification 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) .