c++重载操作符[]的效率

c++ overloading operator [] efficiency

本文关键字:效率 重载 操作符 c++      更新时间:2023-10-16

我只是想知道如何重载运算符[]来访问类中的矩阵,我在这里找到了如何做到这一点。但是,我有一个问题:哪种改变矩阵的方式会更有效?

1:重载操作符[]:(从前面的链接中提取的代码)

class CMatrix {
public:
   int rows, cols;
   int **arr;
public:
   int* operator[]( int const y )
   {
      return &arr[0][y];
   }
   ....
编辑:我太依赖另一个例子了:它应该这样工作吗?
   int* operator[]( int const x )
   {
      return &arr[x];
   }

2:使用"normal"方法:

class CMatrix {
public:
   int rows, cols;
   int **arr;
public:
   void changematrix( int i, int j, int n)
   {
      arr[i][j]=n;
   }
...
修正了changematrix的const

写正确的,可读的代码,让编译器担心效率

如果你有性能问题,并且当你运行分析器来测量性能时(这是你必须在尝试优化之前做的),这段代码显示为性能问题,那么你可以:

1)检查编译器生成的代码的汇编语言解释,启用了完全优化,或者

2)两种方法都试一试,测量一下,然后选择更快的方法。

结果将高度依赖于您正在使用的编译器和您为该编译器指定的标志。

这两种方法都不能像您声明的那样工作

 int **arr;

没有给出

的行长度信息
  return &arr[0][y];
  arr[i][j]=n;

我会选择第三种选择,使用operator()而不是operator[]:

int& operator()(size_t i, size_t j) {
    return arr[i][j];
}
int operator()(size_t i, size_t j) const {
    return arr[i][j];
}

用户将执行:

CMatrix m = ...
m(1,2) = 5;
std::cout << m(1,2);

除此之外,我真的会考虑内部布局数据的方式是否最有效。这是一个锯齿数组吗?还是所有行都有相同的宽度?如果这表示一个矩形数组(即所有行都有相同的列数),您可能最好将所有元素存储在单个1D数组中,并使用一些基本算法来定位正确的元素。