2

我有一个类,其中包含一些 boost::numeric::ublas::matrix。我想重载类的运算符 (+-*/=),以便我可以用一个语句对一组矩阵进行操作。

然而,这似乎需要我的类的临时实例来携带值而不修改原始类。然而,这对我来说很有意义,当我在函数中创建一个新实例并返回它时,我得到:

警告:返回对局部变量“temp”的引用

我对 c++ 很陌生,运算符重载的例子似乎都返回了新的临时对象。我还想避免实例化新矩阵的开销,这导致我循环遍历所有元素。我该怎么办?性能是一个问题。

4

2 回答 2

3

如果您已经在使用 boost,我强烈建议您将boost::operators与您的示例一起使用。

你会得到几个好处:

  1. 您只需要重载 +=/-=/ = 运算符,并免费获得 +/-/运算符。
  2. 您将获得自由实施的运营商的最佳实施。
  3. 您将摆脱您发布的问题,因为您将实施 = 版本,这需要较少的设计。
于 2010-01-02T00:09:29.220 回答
1

运算符重载的常规方式如下。(我认为)

您的就地操作员被定义为成员,例如:

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 内存池库在这里可能很有用。

于 2010-01-01T08:59:37.530 回答