【发布时间】:2018-07-30 12:48:03
【问题描述】:
我不确定我是否应该打扰,因为它不是任何安全关键应用程序,但我只是好奇并且自己无法弄清楚:编译器会为以下方法应用 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 类没有实现移动构造函数,也没有实现移动赋值运算符。我在 Ubuntu 下通过 Qt 5.9 使用 GCC 5.4 (--std=c++14)。
【问题讨论】:
-
Named RVO 可能会发生,但唯一知道的方法是检查程序集。如果你有一个移动构造函数,那么它将为你移动。
-
那里的 RVO 不需要编译器,但我尝试过的 clang 和 gcc 可以。如果您需要移动 QJsonObject,请迁移到 Qt 5.10。
-
我在 Visual Studio 2017 中测试过一次,发现在我的情况下它在 Release 中执行了 NRVO,但在 Debug 中没有执行。
-
感谢大家的建议和实际测试,非常感谢。我明天会将我的 Qt 版本升级到 5.11,并将创建一个任务来提升 CI 服务器中的版本。
标签: c++ qt copy-elision rvo