[英]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::array
和template
函数的方法,在这些方法中我遇到了未知数组大小的问题(......而且对于已知的数组大小,它似乎花费了几乎两倍的时间来进行计算) .
正如其他人评论的那样,您只传递了一个指针和一个大小。 数组是正方形的吗? 也就是说,行和列是一样的?
如果你制作了一个连续的数组,可能会更快。
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.