不使用运算符复制的矩阵乘法 *
Matrix multiplication without copying using operator *
我正在使用 C++。
我想乘以矩阵
class mat
{
mat operator *(const mat& mA,const mat& mB)
}
如果 RVO 开启,那么我将直接使用在 *operator ** 中计算的值。但如果 RVO 关闭,我将不得不复制对象。 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 constructor
和move assignment operator
。
我想确保每个编译器都能在不应对的情况下进行乘法运算。避免复制对象的最佳方法是什么。
而不是 operator*
使用:
void mat::Multiplication(const mat &a, const mat &b, mat &result);
{
result.x = a.x * b.x;
}
我正在使用 C++。 我想乘以矩阵
class mat
{
mat operator *(const mat& mA,const mat& mB)
}
如果 RVO 开启,那么我将直接使用在 *operator ** 中计算的值。但如果 RVO 关闭,我将不得不复制对象。 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 constructor
和move assignment operator
。
我想确保每个编译器都能在不应对的情况下进行乘法运算。避免复制对象的最佳方法是什么。
而不是 operator*
使用:
void mat::Multiplication(const mat &a, const mat &b, mat &result);
{
result.x = a.x * b.x;
}