【发布时间】: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 和这个问题有什么关系?