11

我最近发现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 {};
    }
}
4

1 回答 1

13

好吧,在这种情况下,as-if 规则已经足够了:Data可以简单地复制和简单地破坏,因此您无法观察编译器是否复制它,或者它是否直接将其构造到std::optional<Data>返回对象中。为了防止复制,不需要 NRVO。

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

std::optional<Data> r;
if (condition) {
    r.emplace();
    r.x = 2.0;
    r.y = 2.0;
}
return r;
于 2019-11-15T21:45:02.823 回答