这个问题不是关于C++20中的协程,而是关于协程的一般概念。
最近我正在学习C++20协程。从 协程介绍中了解了有关堆叠型和非堆叠型协程的知识。我还在Stack Overflow上寻找更多信息。
以下是我对非堆叠型协程的理解:
非堆叠型协程在运行时存在于调用者的堆栈上。
当它自己暂停时,由于非堆叠型协程只能在顶层函数中暂停,因此它的堆栈是可预测的,并且有用的数据存储在某个特定区域。
当它没有运行时,它没有堆栈。它与一个句柄绑定,客户端可以通过该句柄恢复协程。
协程TS规定,在为协程帧分配存储空间时调用非数组operator new
。但是,我认为这是不必要的,因此提出了这个问题。
一些解释/考虑:
- 在哪里放置协程的状态呢?原本存储指针的句柄中。
- 动态分配并不意味着存储在堆上。但我的目的是避免调用 operator new,无论它是如何实现的。
- 来自 cppreference:
即使使用自定义分配器,对 operator new 的调用也可以被优化掉,如果
协程状态的生命周期严格嵌套在调用者的生命周期内,以及
协程帧的大小在调用点已知
对于第一个要求,如果协程的生命周期超过了调用者,则仍然可以将状态直接存储在句柄中。
至于其他方面,如果调用者不知道大小,怎么能组合参数调用 operator new 呢?其实,我甚至无法想象在哪种情况下调用者不知道大小。
根据 this question,Rust 似乎有不同的实现。