coroutine_handle<Promise>::from_promise() 如何在 C++ 中工作
How coroutine_handle<Promise>::from_promise() works in C++
我 read coroutine_handle
可以使用 coroutine_handle<Promise>::from_promise()
函数从对协程的 promise 对象的引用中重构。据我所知,promise 对象是这样定义的:
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对象的引用,可以通过句柄的promise()
方法返回。我找不到任何关于 from_promise
函数中实际发生的信息。
它按法令运作。也就是说,它之所以有效,是因为标准 说 它有效,因此实现必须找到一种方法来以可能的方式实现协程。
创建协程时,实现会创建两个东西:coroutine_handle 和 promise 对象。这两个东西的位置完全由编译器控制。因此,编译器可以很容易地将它们彼此连续地分配,这样协程的堆栈基本上会以 struct {coroutine_handle<Promise> handle; Promise promise};
.
开头
根据这些知识,您知道任何 promise 类型的句柄都存在于任何 promise
对象地址之前的 sizeof(coroutine_handle<Promise>)
字节(Promise
类型的对齐要求可以调整这一点,但是这些东西可以从类型中查询)。由于 from_promise
接受一个 promise 对象,您可以只偏移指针并将其转换为 coroutine_handle<Promise>
.
现在,这只是一种方法;实现不必以这种方式进行。重要的是实现可以控制 promise 对象相对于协程内部数据的位置。或者更具体地说,承诺存在于该内部数据的内部。无论您如何看待它,编译器都知道将 promise 的地址转换为填充 coroutine_handle
.
所需的内部数据所需的一切。
我 read coroutine_handle
可以使用 coroutine_handle<Promise>::from_promise()
函数从对协程的 promise 对象的引用中重构。据我所知,promise 对象是这样定义的:
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对象的引用,可以通过句柄的promise()
方法返回。我找不到任何关于 from_promise
函数中实际发生的信息。
它按法令运作。也就是说,它之所以有效,是因为标准 说 它有效,因此实现必须找到一种方法来以可能的方式实现协程。
创建协程时,实现会创建两个东西:coroutine_handle 和 promise 对象。这两个东西的位置完全由编译器控制。因此,编译器可以很容易地将它们彼此连续地分配,这样协程的堆栈基本上会以 struct {coroutine_handle<Promise> handle; Promise promise};
.
根据这些知识,您知道任何 promise 类型的句柄都存在于任何 promise
对象地址之前的 sizeof(coroutine_handle<Promise>)
字节(Promise
类型的对齐要求可以调整这一点,但是这些东西可以从类型中查询)。由于 from_promise
接受一个 promise 对象,您可以只偏移指针并将其转换为 coroutine_handle<Promise>
.
现在,这只是一种方法;实现不必以这种方式进行。重要的是实现可以控制 promise 对象相对于协程内部数据的位置。或者更具体地说,承诺存在于该内部数据的内部。无论您如何看待它,编译器都知道将 promise 的地址转换为填充 coroutine_handle
.