我有一个类,其中包含一些 boost::numeric::ublas::matrix。我想重载类的运算符 (+-*/=),以便我可以用一个语句对一组矩阵进行操作。
然而,这似乎需要我的类的临时实例来携带值而不修改原始类。然而,这对我来说很有意义,当我在函数中创建一个新实例并返回它时,我得到:
警告:返回对局部变量“temp”的引用
我对 c++ 很陌生,运算符重载的例子似乎都返回了新的临时对象。我还想避免实例化新矩阵的开销,这导致我循环遍历所有元素。我该怎么办?性能是一个问题。
我有一个类,其中包含一些 boost::numeric::ublas::matrix。我想重载类的运算符 (+-*/=),以便我可以用一个语句对一组矩阵进行操作。
然而,这似乎需要我的类的临时实例来携带值而不修改原始类。然而,这对我来说很有意义,当我在函数中创建一个新实例并返回它时,我得到:
警告:返回对局部变量“temp”的引用
我对 c++ 很陌生,运算符重载的例子似乎都返回了新的临时对象。我还想避免实例化新矩阵的开销,这导致我循环遍历所有元素。我该怎么办?性能是一个问题。
如果您已经在使用 boost,我强烈建议您将boost::operators与您的示例一起使用。
你会得到几个好处:
运算符重载的常规方式如下。(我认为)
您的就地操作员被定义为成员,例如:
foo& operator+=(const foo& rhs);
foo& operator*=(const foo& rhs);
// etc.
这只是做他们需要的*this
:
foo& operator+=(const foo& rhs)
{
// add elements together
return *this;
}
然后制作自由函数,并在参数中完成复制:
const foo operator+(foo lhs, const foo& rhs)
{
return lhs += rhs;
}
返回值是const
因为这样做很奇怪:
foo a, b, c;
(a + b) = c;
同样,这样做很奇怪:
int a, b, c;
(a + b) = c;
虽然你会对此有不同的看法。这就是您重用代码并自动为您完成复制的方式。非常简洁易读。
不过,就像 Neil 和我在上面所说的那样,如果您正在创建新数据,那么在某些时候数据需要有一个新的位置来存放。尽可能使用变异运算符来避免这种情况,但有些事情根本无法逃脱。
它甚至可能不是问题。如果是,请尝试优化您拥有的内存分配;这些可能是最慢的部分。我不确定,但我认为大多数 boost 类都可以让你指定一个分配器。boost 内存池库在这里可能很有用。