RVO是否可以在这种情况下工作?

时间:2018-07-30 12:48:03

标签: c++ qt copy-elision rvo

我不确定是否应该打扰,因为它不是安全性至关重要的应用程序,但是我很好奇,自己也无法弄清楚:编译器会为以下方法应用RVO吗?

QJsonObject MyClass::buildObject(const QVector2D& position, const QString& id) const
{
    QJsonObject retObject {
        {"Position", QJsonArray{position.x(), position.y()}},
    };

    if (!id.isNull() && !id.isEmpty())
    {
        retObject.insert("Id", id);
    }

    return retObject;
}

QJsonObject类没有实现move构造函数,也没有实现move赋值运算符。我正在Ubuntu下通过Qt 5.9使用GCC 5.4(--std = c ++ 14)。

1 个答案:

答案 0 :(得分:1)

在此允许编译器执行RVO,但不是必须这样做,请参阅。 cppreference

  

如果函数按值返回类类型,并且return语句的表达式是具有自动存储持续时间的非易失性对象的名称,该对象不是函数参数,也不是catch子句参数,并且具有与函数的返回类型相同的类型(忽略顶级cv限定),然后省略复制/移动(自C ++ 11起)。构造该本地对象后,将直接在将函数的返回值移动或复制到的存储器中构造该对象。复制省略的这种变体称为NRVO,“命名为返回值优化”。

因此,编译器无法在返回时优化复制retObject,但是可以省略创建临时返回值对象,而直接将retObject复制到分配的MyClass::BuildObject上。