【问题标题】:Is it possible to implement move operator+/operator-/operator* for class of Matrix?是否可以为 Matrix 类实现 move operator+/operator-/operator*?
【发布时间】:2020-04-14 09:04:48
【问题描述】:

我正在考虑如何使用加(减)和乘操作来定义一类实矩阵 NxN。我正在寻找高效的内存使用。

class Matrix {
private:
    std::size_t _size_n;
    double **_pMatrix;

public:
    Matrix(const size_t n);

    ~Matrix();

    double &operator()(size_t, const size_t);

    double operator()(size_t, const size_t) const;

    size_t size_n() const { return _size_n; }
};

std::ostream &operator<<(std::ostream &, const Matrix &);

Matrix operator+(const Matrix&, const Matrix&);
Matrix operator-(const Matrix&, const Matrix&);
Matrix operator*(const Matrix&, const Matrix&);

【问题讨论】:

  • 不清楚你想把什么移动到哪里,或者你想避免什么副本。参数已经是引用了。
  • 顺便说一句,您应该注意rule of 3/5,或者使用std::vector 而不是double**
  • @idclev463035818: (a+b)+c 创建 2 个临时对象(a+b 和最终总和),而 (a+b)+=c 只会创建一个(但语法不好)。
  • @Jarod42 我不得不三思而后行才能明白为什么搬家有帮助,但我仍然认为问题可能更清楚,所以我没有删除评论
  • @idclev463035818:实际上它并没有移动,但是我们避免通过重用一个参数来分配新的矩阵。而不是auto res = tmp + var2; return res;,我们可能会做tmp += var2; return tmp;。但我同意这还不清楚。

标签: c++ matrix move operator-keyword memory-efficient


【解决方案1】:

是的,你可以有额外的重载

Matrix/*&&*/ operator+(const Matrix&, Matrix&&);
Matrix/*&&*/ operator+(Matrix&&, const Matrix&);
Matrix/*&&*/ operator+(Matrix&&, Matrix&&);

要重用其中一个临时的内存。

它们都可以用Matrix&amp; operator += (Matrix&amp;, const Matrix&amp;)来实现 通过更改顺序,因为 + 是对称的。 operator - 需要专用代码。

另一种优化内存的方法是使用expression templates,而不是直接计算结果。

不过,它在生命周期问题上有其缺点(尤其是 auto)。

【讨论】:

  • 我需要这样做吗?矩阵运算符+(const Matrix& left, Matrix&& right) { right += left;返回正确; }?那么 += 必须是具体的吗?
  • 对于+,可以,但是对于-,你不能这样改变顺序;-)
猜你喜欢
  • 2012-12-02
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2011-06-07
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多