矩阵乘法而不使用运算符复制*

时间:2017-01-20 09:50:31

标签: c++ matrix-multiplication

我正在使用C ++。 我想乘以矩阵

class mat
{
 mat operator *(const mat& mA,const mat& mB)
}

如果RVO为ON,那么我将直接使用* operator **中计算的值。但如果RVO关闭,我将不得不复制该对象。 RVO不是标准的一部分。我想确保每个conmpiler都能在没有应对的情况下成倍增加。什么是避免复制对象的最佳方法。我的问题包括C ++ 11,14。

有没有办法重写* operator **来乘法矩阵而不会产生应对结果,即使RVO处于关闭状态。

2 个答案:

答案 0 :(得分:1)

如果使用C++11,那么为什么不使用Move constructorsMove 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 operatorclass mat

我想确保每个编译器都能在没有应对的情况下进行乘法运算。什么是避免复制对象的最佳方法。

而不是operator*使用:

void mat::Multiplication(const mat &a, const mat &b, mat &result);
{
    result.x = a.x * b.x;
}

答案 1 :(得分:0)

等待C ++ 17,其中指定在某些情况下发生RVO。除此之外,请查看您的编译器保证的具体细节,这可能超出标准要求。