88得票3回答
C++20的无栈协程是否存在问题?

根据以下内容,看起来C++20中的协程将是无栈的。 https://en.cppreference.com/w/cpp/language/coroutines 我有很多顾虑: 在嵌入式系统中,堆分配通常是不可接受的。 当处于低级代码时,嵌套使用co_await会很有用(我不认为无栈协程...

34得票1回答
C++20中协程的机制是什么?

我尝试阅读与协程函数调用、挂起、恢复和终止相关的文档(cppreference和有关该功能的标准文档),文档详细介绍了各种扩展点,允许库开发人员使用库组件自定义其协程行为。总体而言,这种语言特性似乎非常精心设计。 不幸的是,我很难理解协程执行的机制以及作为库开发人员如何使用各种扩展点来自定义...

21得票1回答
C++20 协程,await_resume、return_value 和 yield_value 的意外重排序

背景 我有一个任务类型,可以同时使用co_return和co_yield。在LLVM中,任务按预期工作,并通过了一些早期测试。在MSVC和GCC中,代码以相同的方式失败(巧合吗?)。 简要问题 使用以下测试函数:Task<int> test_yielding() { co...

20得票1回答
通过C++20协程生成Python生成器

假设我有以下这段Python代码: def double_inputs(): while True: x = yield yield x * 2 gen = double_inputs() next(gen) print(gen.send(1)) ...

20得票3回答
C++20协程帧需要预留多少内存?

首先,我想预测代码的内存使用情况,就像任何负责任的程序员一样。即使我没有决定使用放置new来分配协程框架,这也适用于我(请参见下面的伪代码)。即使我改变了关于放置new所有协程的想法,因此让编译器在堆上分配所有协程,我仍然希望C++语言告诉我将吃掉多少堆内存。 但是,在现实生活中,我正在针对...

19得票1回答
传递给协程的临时对象何时被销毁?

我对传递给协程任务的临时对象的生命周期感到困惑。考虑这个例子:cppcoro::task<> UseObject(Object const& object); cppcoro::task<> CallUseObject() { co_await Use...

18得票1回答
"co_await运算符实际上是做什么的?"

我在互联网上搜索了关于 co_await 运算符做什么的内容,但我还是无法理解。 我猜测以下代码: co_await foo(); 挂起协程直到foo完成,但在这种情况下它与简单调用foo有什么不同: foo(); 此操作也会暂停当前函数,直到foo完成。请解释。

18得票1回答
C++1z协程线程上下文和协程调度

根据最新的C++ TS:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4628.pdf,以及对C# async/await语言支持的理解,我想知道C++协程的“执行上下文”(从C#借来的术语)是什么? 我的简单测试代码在Vi...

14得票1回答
C++20协程:实现可等待的future

自从在Kona的ISO会议上,协同程序TS已经被接受并纳入了C++20标准,我开始对它们进行一些尝试。Clang已经具有相当不错的协程支持,但库支持的实现仍然缺少。特别是像std::future、std::generator等类型尚未实现。因此,我决定让std::future可等待。我主要参考...

13得票2回答
C++20协程中Lambda的生命周期解释

Folly拥有一个可用的C++20风格协程库。 在Readme中,它声称: 重要提示:您需要非常小心临时lambda对象的生命周期。调用lambda协程会返回一个捕获对lambda的引用的folly::coro::Task,因此,如果未立即对返回的Task进行co_await,则当临时l...