C++1z 协程是一种语言功能
C++1z Coroutines a language feature?
为什么协程(截至目前在 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(。
- 在C++中使用另一种语言
- 尝试用另一种语言解密时 AES 解密错误
- 是否有一种方法可以更准确地确定两种语言中的哪种语言中的哪种方法
- 解释Java作为一种安全语言?
- 如何在另一种语言的随机函数中复制C++兰特?
- 将代码片段转换为另一种语言 不必要的 = OP
- c++是一种与空白无关的语言,这是规则的例外
- 将C++结构写入文件并使用另一种编程语言读取文件
- C++1z 协程是一种语言功能
- 我怎样才能用另一种语言(也许C++)实现Python集
- 一种语言可以有编译时检查但具有动态类型的特性吗
- 用另一种语言包装C++对象的策略——内存管理
- 正在创建将在另一种语言上调用的win32api(dll)
- 将一种语言嵌入到另一种语言中有什么作用?
- FormatMessage转换为另一种语言
- 演员模型:Erlang/OTP为什么特别?你能用另一种语言吗?
- 用另一种语言嵌入shell脚本
- 如何使用Yacc将一种语言翻译成c++
- Tesseract设置另一种语言的可变白名单
- 是C/ c++一种语言还是两种语言