Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用复制运算符的矩阵乘法* 我使用C++。 我想乘矩阵 class mat { mat operator *(const mat& mA,const mat& mB) }_C++_Matrix Multiplication - Fatal编程技术网

不使用复制运算符的矩阵乘法* 我使用C++。 我想乘矩阵 class mat { mat operator *(const mat& mA,const mat& mB) }

不使用复制运算符的矩阵乘法* 我使用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打开,则我将直接使用*运算符**中计算的值。但如果RVO关闭,我将不得不复制该对象。RVO不是标准的一部分。我想确定的是,每一个骗子都会在没有应对的情况下成倍增长。避免复制对象的最佳方法是什么。我的问题包括C++11,14


是否有方法重写*运算符**以在不使用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;
}