gpt4 book ai didi

c++ - NRVO 是否也适用于协程?

转载 作者:行者123 更新时间:2023-12-01 14:03:25 25 4
gpt4 key购买 nike

在以下示例中,根据 this article 应用 NRVO(命名返回值优化):

std::string f1()
{
std::string str;

return str; // NVRO applies here!
}

但是,请考虑:
task<std::string> f2()
{
std::string str;

co_return str; // Does NVRO also apply here?
}

最佳答案

为了完整起见,C++17 中的保证省略仅适用于直接从函数返回纯右值。返回命名变量只有在编译器喜欢的情况下才会被省略。

至于你的问题的核心, co_return 值永远不会受到复制省略,保证或其他。省略 return 关键字的返回值键,并且不允许协程使用 return 。他们使用 co_return ,其中 elision logic in the standard doesn't key off of 。所以省略不适用。

这样做的原因是因为协程是如何工作的。协程是一个包含 promise 对象的函数。这个 promise 对象是你如何将协程的 co_return 值(和其他状态)传送到协程函数返回的“ future ”对象。

Elision 在普通函数中工作,因为调用约定要求调用者将返回值的存储传递给函数。因此该函数的实现可以选择只在该存储中构建对象,而不是构建一个单独的堆栈对象并在 return 上复制到其中。

在协程中,返回值存在于 Promise 中,因此这不可能真正发生。

关于c++ - NRVO 是否也适用于协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61870280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com