【问题标题】:Named Return Value Optimization when using std::optional使用 std::optional 时的命名返回值优化
【发布时间】:2019-11-15 21:39:40
【问题描述】:

我最近发现std::optional 可以提高代码的清晰度,尤其是对于函数的返回值。但是,我对它对性能的影响有疑问。更具体地说,我想知道是否可以编写类似于以下代码的代码,以允许编译器应用命名返回值优化。

struct Data
{
    int x;
    int y;
};

std::optional<Data> makeData(bool condition)
{
    Data data;

    if(condition)
    {
        data.x = 2.0;
        data.y = 2.0;

        return data;
    }
    else
    {
        return {};
    }
}

【问题讨论】:

  • 您甚至可以通过if (condition) return Data{2., 2.}; else return std::nullopt; 拥有RVO。
  • return语句的类型必须与RVO的函数返回类型一致。

标签: c++ optional nrvo


【解决方案1】:

好吧,在这种情况下,as-if 规则已经足够了:Data 是普通可复制和普通可破坏的,因此您无法观察编译器是否复制它,或者它是否直接将其构造到 std::optional&lt;Data&gt; 返回目的。为了防止复制,不需要 NRVO。

假设您给Data 一个带有副作用的复制构造函数。那么 NRVO 是否适用的问题将是相关的。答案是否定的:NRVO 不适用,因为局部变量的类型与函数返回类型不同。为了让 NRVO 发生,你可以这样写:

std::optional<Data> r;
if (condition) {
    r.emplace();
    r.x = 2.0;
    r.y = 2.0;
}
return r;

【讨论】:

  • Data 是非复制不可移动类的任何解决方案? NRVO 与 RVO 不同,不能保证。
  • 哦,我可以回答我自己的评论。 std::in_place 是我的朋友。我可以return std::optional&lt;Data&gt;{std::in_place, 2.0, 2.0}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多