Sil*_*cer 6 c++ c++-standard-library c++20 c++-coroutine
这个问题其实是两个问题。我会马上问他们,因为他们可能有关系。
我刚刚第一次看到 C++20 协程。如果看过各种例子,他们中的大多数都非常基础。像下面这样:
generator<int> ints(int x)
{
for (int i = 0; i < x; ++i)
{
co_yield i;
}
}
Run Code Online (Sandbox Code Playgroud)
所有的例子都使用一个特殊的返回类型,显然包含计算结果和协程上下文。但是没有示例使用标准返回类型。他们要么偷偷地忽略该类型,要么定义一个难以理解的自定义嵌套类(对我来说,目前)。
1. 这是否意味着 C++20 标准库不提供可用于例如生成器的协程返回类型?
我能找到的最好的std::coroutine_handle方法是提到的自定义类在内部使用。
在文档中,据说协程是一种很好的工具,可以实现需要逐块数据处理的算法,并且通常需要将其拆分为片段,例如使用(可能非常复杂)状态引擎。我也是这么理解的。我什至记得一些项目是协程的一个很好的用例,即使用流接口加载一个大的、复杂的 XML 文件。
似乎仍然有很大的不同:在实现状态引擎时,将状态存储到磁盘或从磁盘加载状态非常容易,因为所有状态数据都可以作为标准变量使用(一些错误检查和文件处理就足够了)。我想到了类似用户界面的东西来取消/恢复长时间运行的计算。
2. 是否有(简单的)方法来存储/加载协程上下文到/从永久存储?C++20 标准中是否有任何内容有助于这样做?
- 这是否意味着 C++20 标准库不提供可用于生成器等的协程返回类型?
它不是。虽然技术规范提出了如何使类型协程兼容的所有细节,但它或其任何修订都没有提出任何标准协程兼容类型。
它确实提供了至少一种生成器的玩具实现,只需稍加调整即可使用。
p2168正式提出了一种std::generator在协程中使用的类型。您还可以查看 Lewis Baker 的cppcoro库。
- 是否有一种(简单)方法可以将协程上下文存储到永久存储或从永久存储加载?
最简洁的答案是不”。
C++20 标准中有什么可以帮助做到这一点吗?
简短的回答也是“不”。
创建协程时,编译器将在堆上为协程上下文分配一些空间,其中包括局部变量和参数的副本/引用。与函数调用的堆栈帧完全不同。但是,我们不会序列化堆栈帧,不是吗?这不太有道理。
可以这样想,如果你想序列化一个常规函数,你可以把它变成一个对象。就像命令模式一样。结果并不完全像堆栈帧,但您仍然可以调用一些东西来完成您所需要的操作。
协程也不例外。如果您需要序列化/反序列化状态,您可以使用可调用对象。您可以在协程中使用此对象,但它不会完全相同。
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |