【问题标题】:RVO Operators With Multiple Returns具有多个返回的 RVO 运算符
【发布时间】:2014-10-30 22:57:01
【问题描述】:

我们正在课堂上使用 RVO 来展示如何减少创建的临时对象的数量。

我了解了它的基础知识,但我很难理解如何将多个值组合成一行。

对于单一的临时优化,我很容易理解它

const A operator + ( const A &tmp)
{
    A sum;
    sum = this->x + tmp.x;
    return sum;
}

可以简化为:

const A operator + ( const A &tmp)
{
    return A(this->x + tmp.x);
}

但是我不确定如何将其应用于具有多个要返回的值的函数。 例如:

Vect2D operator - ( const Vect2D &tmp ) const;

Vect2D Vect2D::operator - ( const Vect2D &tmp ) const
{
    Vect2D sum;

    sum.x = this->x - tmp.x;
    sum.y = this->y - tmp.y;

    return ( sum );
};

我背后的过程是:

Vect2D Vect2D::operator - ( const Vect2D &tmp ) const
{
    return Vect2D((this->x - tmp.x), (this->y - tmp.y));
};

返回一个错误,告诉我“no argument takes the value (float, float)”。

我需要重新组织最初的吗

Vect2D 运算符 - ( const Vect2D &tmp ) const;

在里面取两个浮点参数?还是我想错了?

谢谢,

E: 感谢 Matt 和 Jerry 确认我认为我需要对双浮点运算符做些什么。

【问题讨论】:

  • 我不明白您的确切问题是什么,您能否发布一段代码,其中创建了太多临时代码并需要修复?
  • (N)RVO 是 as-if 规则的一个例外,它通常管理允许的编译器优化。看来您正试图使编译器免于(大部分苦差事)不得不使用该规则。
  • Vect2D((this->x - tmp.x), (this->y - tmp.y)); 行尝试使用带有两个参数的构造函数创建Vect2D。您的错误消息表明没有这样的构造函数,所以也许您应该添加一个!
  • 为了让您的return Vect2D((this->x - tmp.x), (this->y - tmp.y)); 工作,您需要一个Vect2D::Vect2D(float, float),从这两个值构造返回对象。
  • RVO 和这个问题有什么关系?

标签: c++ rvo


【解决方案1】:

我的问题的解决方案是不理解运算符需要 Friend 函数才能有两个参数。虽然不完全是 RVO,但该解决方案确实减少了通过在其中包含两个变量的 return 创建的临时数。

再次感谢马特和杰瑞让我开始这个过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多