[英]How coroutine_handle<Promise>::from_promise() works in C++
我读到coroutine_handle
可以使用coroutine_handle<Promise>::from_promise()
ZC1C425268E68385D14AB5074C17A 从对协程 promise object 的引用重构据我所知,promise object 的定义如下:
class resumable{
public:
struct promise_type;
bool resume();
};
struct resumable::promise_type{
resumable get_return_object() {/**/}
auto initial_suspend() {/**/}
auto final_suspend() {/**/}
void return_void() {}
void unhandled_exception();
};
鉴于promise_type
不包含对协程句柄的任何引用,我无法弄清楚重建如何工作。 恰恰相反,协程句柄存储了对 promise object 的引用,可以通过句柄的promise()
方法返回。 我找不到关于from_promise
function 中实际发生的任何信息。
它通过法定货币运作。 也就是说,它之所以有效,是因为标准说它有效,因此实现必须找到一种方法来以一种可能的方式实现协程。
创建协程时,实现会创建两个东西:coroutine_handle 和 promise object。 这两件事的位置完全由编译器控制。 因此,编译器可以很容易地将它们彼此连续分配,这样协程的堆栈基本上会以struct {coroutine_handle<Promise> handle; Promise promise};
struct {coroutine_handle<Promise> handle; Promise promise};
.
有了这些知识,您就知道任何 promise 类型的句柄在任何promise
对象的地址之前都存在sizeof(coroutine_handle<Promise>)
个字节( Promise
对象的地址的对齐要求可以从该类型中调整) 由于from_promise
采用 promise object,因此您只需偏移指针并将其强制转换为coroutine_handle<Promise>
。
现在,这只是一种方法; 实现不必这样做。 重要的是,实现可以控制 promise object 相对于协程内部数据的位置。 或者更具体地说,promise 存在于该内部数据中。 无论您如何看待它,编译器都知道将 promise 的地址转换为填充coroutine_handle
所需的内部数据所需的一切。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.