繁体   English   中英

C++ 通过引用有效地传递未知大小的二维数组

[英]C++ efficiently pass 2D-array of unknown size by reference

所以我知道之前有人问过类似的问题,但我不太明白我在找什么。

我想要一个function,分为.h和.cpp文件,它可以对二维数组进行一些计算,并在计算过程中修改数组。 目前我的代码看起来像这样:

主.cpp:

int gridsize = 100; // usually in range 50-200
int **grid = ...; // define dynamic array

myFunction(grid, gridsize);

我的函数.h:

void myFunction(int **grid, int gridsize);

我的函数.cpp:

void myFunction(int **grid, int gridsize)
{
   for(int step = 0; step <= MAX_STEPS; step++)
   {
      int i = ...;
      int j = ...;
      grid[i][j] = someCalculation();
   }
}

......目前这是我想要的。

现在,问题是,这是唯一/最好的方法吗? myFunction 应该适用于编译时未知的不同数组大小,我正在寻找良好的性能,因为 myFunction 在执行期间将被调用 ~10^6 次并且每次调用将执行 ~10^5 数组访问,这目前对应于运行时小时的范围。

我会知道如何使用std::vector做到这一点,但这似乎比我当前的代码慢大约 1.5 倍。 我还看到了一些使用std::arraytemplate函数的方法,在这些方法中我遇到了未知数组大小的问题(......而且对于已知的数组大小,它似乎花费了几乎两倍的时间来进行计算) .

正如其他人评论的那样,您只传递了一个指针和一个大小。 数组是正方形的吗? 也就是说,行和列是一样的?

如果你制作了一个连续的数组,可能会更快。

int * array = new int[width * height];

// Then if i ranges over the rows (height) and j over the columns (width):
int someValue = array[i * width + j];

然后你可以让它更快:

for (int row = 0; row < height; ++row) {
     int colStart = row * width;
     for (int col = 0; col < width; ++col, ++colStart) {
         int value = array[colStart];
     }
}

我不知道那是否更快,但它可能会击败取消引用指针。 但请记住,预测分支会使您的代码更快,因此请注意优化方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM