不使用复制运算符的矩阵乘法* 我使用C++。 我想乘矩阵 class mat { mat operator *(const mat& mA,const mat& mB) }
如果RVO打开,则我将直接使用*运算符**中计算的值。但如果RVO关闭,我将不得不复制该对象。RVO不是标准的一部分。我想确定的是,每一个骗子都会在没有应对的情况下成倍增长。避免复制对象的最佳方法是什么。我的问题包括C++11,14不使用复制运算符的矩阵乘法* 我使用C++。 我想乘矩阵 class mat { mat operator *(const mat& mA,const mat& mB) },c++,matrix-multiplication,C++,Matrix Multiplication,如果RVO打开,则我将直接使用*运算符**中计算的值。但如果RVO关闭,我将不得不复制该对象。RVO不是标准的一部分。我想确定的是,每一个骗子都会在没有应对的情况下成倍增长。避免复制对象的最佳方法是什么。我的问题包括C++11,14 是否有方法重写*运算符**以在不使用RVO的情况下对矩阵进行乘法而不产生结果。等待C++17,在某些情况下指定发生RVO。除此之外,请查看编译器保证的具体细节,这可能超出标准要求。如果使用C++11,为什么不使用和 只要通过重载解析选择,就会调用move构造函数,这
是否有方法重写*运算符**以在不使用RVO的情况下对矩阵进行乘法而不产生结果。等待C++17,在某些情况下指定发生RVO。除此之外,请查看编译器保证的具体细节,这可能超出标准要求。如果使用C++11,为什么不使用和 只要通过重载解析选择,就会调用move构造函数,这通常发生在从同一类型的rvalue xvalue或prvalue初始化对象时,包括 函数按值返回。 因此,假设mat::x是静态分配的int,则可以使用其中之一: 还为类mat提供相应的移动构造函数和移动赋值运算符 我想确定的是,每个编译器都会进行乘法运算。避免复制对象的最佳方法是什么 不要使用操作员*使用:
为什么要禁用RVO和复制省略?你能详细说明一下你遇到的实际问题吗?我想确保每个编译器的行为都是一样的。这不太可能出现,每个编译器都按照其设计人员决定的方式编译,你可能需要的唯一一件事是保留语义。似乎你想做过早的优化。不要。首先,确保您的代码可读性和可维护性,最重要的是工作正常。然后,如果速度不够快,就开始测量和分析瓶颈。主要针对最严重的瓶颈进行优化,而忽略较小的瓶颈。重复,直到足够快。记住记录优化和重构的代码,因为优化重构会使代码更难阅读、理解和维护。@VladimirYanakiev-我想确保每个编译器的行为都是相同的-你不能保证这一点。可以保证的是,无论优化是开启还是关闭,主动还是被动,最终结果都是一样的。编译器制造商在谁能更好地优化代码上相互竞争,所以你对编译器编写者如何优化代码的技巧内部没有发言权。我要求的是类似这样的东西,但在使用move-reference将rvalue引用返回mat的情况下,我仍然不太擅长rvalie引用。您介意扩展代码吗?实际上,这个问题的主要原因是在本例中使用了rvlue引用。离我远一点
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;
}
void mat::Multiplication(const mat &a, const mat &b, mat &result);
{
result.x = a.x * b.x;
}