我正在使用C ++。 我想乘以矩阵
class mat
{
mat operator *(const mat& mA,const mat& mB)
}
如果RVO为ON,那么我将直接使用* operator **中计算的值。但如果RVO关闭,我将不得不复制该对象。 RVO不是标准的一部分。我想确保每个conmpiler都能在没有应对的情况下成倍增加。什么是避免复制对象的最佳方法。我的问题包括C ++ 11,14。
有没有办法重写* operator **来乘法矩阵而不会产生应对结果,即使RVO处于关闭状态。
答案 0 :(得分:1)
如果使用C++11
,那么为什么不使用Move constructors和Move assignment operator。
每当通过重载决策选择时都会调用移动构造函数,这通常发生在从相同类型的rvalue(xvalue或prvalue)初始化对象时,包括
因此,假设mat::x
被静态分配int
,可以使用其中一个:
friend mat&& mat::operator*(const mat &a, const mat &b)
{
mat *c = new mat();
c->x = a.x * b.x;
return std::move(*c);
}
friend mat mat::operator*(const mat &a, const mat &b)
{
mat c;
c.x = a.x * b.x;
return c;
}
还为move constructor
提供相应的move assignment operator
和class mat
。
我想确保每个编译器都能在没有应对的情况下进行乘法运算。什么是避免复制对象的最佳方法。
而不是operator*
使用:
void mat::Multiplication(const mat &a, const mat &b, mat &result);
{
result.x = a.x * b.x;
}
答案 1 :(得分:0)
等待C ++ 17,其中指定在某些情况下发生RVO。除此之外,请查看您的编译器保证的具体细节,这可能超出标准要求。