使用std :: optional时命名为返回值优化

我最近发现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 {};
    }
}
hhzrri 回答:使用std :: optional时命名为返回值优化

在这种情况下,按条件规则已经足够了:Data是可复制且可破坏的,因此您无法观察编译器是否将其复制,或是否将其直接构造为{{ 1}}返回对象。无需NRVO即可防止复制。

让我们假设您给std::optional<Data>一个具有副作用的副本构造函数。那么是否适用NRVO的问题就很重要。答案是否定的:NRVO不适用,因为局部变量的类型与函数返回类型不同。为了使NRVO发生,您可以编写如下内容:

Data
本文链接:https://www.f2er.com/3092425.html

大家都在问