【问题标题】:overhead in addressing 2d array in linear memory space在线性内存空间中寻址二维数组的开销
【发布时间】:2010-08-31 21:21:03
【问题描述】:

是否像在

中那样以线性方式寻址多维数组中的寻址值
values[row_num*row_width + column_num]

与 values[row][col] 相比,是否需要额外计算乘法/加法?还是编译器将后者转换为前者?

【问题讨论】:

    标签: c++ performance memory


    【解决方案1】:

    假设您正在比较索引,例如int values[M*N]int values[M][N],那么它们将在实践中创建等效的代码。

    但是,如果您使用 values[row][col] 来索引,例如int (*values)[N],那就另当别论了……

    【讨论】:

      【解决方案2】:

      这取决于。如果你这样声明一个数组:

      int values[m][n];
      

      然后编译器优化访问,即使用线性内存并计算正确的偏移量(就像在您的伪代码中一样)。

      但是如果你这样声明一个数组:

      int **values;
      values = new int*[m];
      for (size_t i = 0; i < m; ++i) values[i] = new int[n];
      

      那么编译器就不能像这样优化数组访问

      values[row][col]
      // same as
      *(*(values+row) + col)
      

      即这样的代码会产生一个额外的内存访问。而且由于在当前架构上,内存访问比计算偏移量要贵几个数量级,因此这种多维数组样式的效率低于使用线性内存块和计算(或让编译器在可能的情况下计算)偏移量。

      【讨论】:

        【解决方案3】:

        编译器是否转换后者 还是前者?

        是的。如果您索引连续的内存位置,缓存将对您大有裨益。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-22
          • 2012-08-22
          • 2012-11-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多