【问题标题】:C++ Operator+ Overloading of Matrix矩阵的 C++ 运算符+重载
【发布时间】:2016-10-06 20:04:19
【问题描述】:

我正在学习构建自己的 Matrix 类,并得到一个关于 operator+ 重载的问题。

Matrix Matrix::operator+(Matrix &b)
{
    Matrix temp;
    *
    *
    *
    return temp;
}
c = a + b;

这很好用,但我有点担心我先声明一个临时矩阵然后将其复制到最终目标(矩阵 c)是否效率低下?例如,下面是一个简单的矩阵相加函数,

void matrixAdd(Matrix& c, Matrix& a, Matrix& b)
{
    c[][]=a[][]+b[][];
}

当然,第一个更容易使用,但第二个会更快吗?如果是这样,我该如何改进第一个?

【问题讨论】:

  • 制作自己的矩阵类有什么好处?我觉得 glm 库做得足够了
  • @Charlie 可能只是为了学习编程类的基本技术。
  • 如果您想了解如何实现这样的Matrix 类,请查看我在GitHub 上名为Matrix 的项目。
  • 顺便说一句,您确定variable[][] 语法正确吗?考虑到operator[] 必须只有一个参数,AFAIK,这对我来说看起来很奇怪。
  • @ForceBru 我的矩阵类继承自vector

标签: c++ class matrix overloading


【解决方案1】:

您的 sn-p 与现代编译器兼容。

他们将使用称为命名返回值优化的技术优化temp 的明显深层副本。

换句话说,编译器会在第一个 sn-p 中为您做出改进,而第二个最终不会更快。更多详情请见https://en.wikipedia.org/wiki/Return_value_optimization

不过,最好将原型更改为

Matrix Matrix::operator+(const Matrix &b) const

因此您可以将运算符应用于const 参数。

【讨论】:

  • 非常感谢您的回答!如果将矩阵类构建为库,这会有什么不同吗?
  • 一点也不——命名返回值优化让我们都可以编写更清晰的代码。
  • 我刚刚测试了这两种方法,发现第二个比第一个快30倍。
  • 这可能是由于测试设置中的问题,除非默认构造函数很慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多