协程C++返回对象的存储位置有保证吗?

问题描述 投票:0回答:1

让以下内容成为协程:

ReturnType foo(Args args)

以及以下调用场景:

void caller() {
   ReturnType ret = foo(...);
}

据我调用协程 foo 后的理解:

  1. 构建协程激活框架(如果使用::new 必要)
  2. promise_type 是在激活框架中构造的,假设调用以下内容:
    promise_type promise{...};
  3. promise.get_return_object() 被调用。
  4. 然后调用 co_await Promise.initial_suspend()。
  5. 现在有两个选择:foo() 是否暂停

如果 foo 被挂起,现在是否有一个 return 语句将 retun_object 返回给调用者?可能有返回值优化?

如果 foo 没有挂起,我想协程需要将 return_object 存储在协程激活帧上,可能存储在协程激活帧的堆栈或堆部分上,然后在挂起的第一个点或 co_return 处,有一个返回 return_object将对象返回给调用者的语句。我说得对吗?

c++ c++-coroutine
1个回答
0
投票

如果 foo 被挂起,现在是否有一个 return 语句将 retun_object 返回给调用者?

没有必要。对

get_return_object
的调用已经填充了调用者的返回值。如果协程需要存储返回对象(或更可能的是,存储实际返回值,并将给定的值指向它的调用者),那么它有机会在
get_return_object
中这样做。这就是这个函数的用途for

与任何函数的返回值一样,它位于调用者的堆栈上,而不是函数本身。

© www.soinside.com 2019 - 2024. All rights reserved.