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

Matrix multiplication without copying using operator *

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

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

如果 RVO 开启,那么我将直接使用在 *operator ** 中计算的值。但如果 R​​VO 关闭,我将不得不复制对象。 RVO 不是标准的一部分。我想确保每个编译器都能在不应对的情况下进行乘法运算。避免对象复制的最佳方法是什么。我的问题包括 C++11,14。

有没有办法重写 *operator ** 来乘矩阵而不处理结果,即使 RVO OFF。

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

如果使用 C++11 那么为什么不使用 Move constructors and Move assignment operator.

只要通过重载决议选择,就会调用移动构造函数,这通常发生在从相同类型的右值(xvalue 或 prvalue)初始化对象时,包括

  • 函数 return 按值。

因此,假设 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;
}

同时提供class mat对应的move constructormove assignment operator

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

而不是 operator* 使用:

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