快速复制2D数组中的元素

时间:2015-11-10 17:06:39

标签: arrays pointers

我想改变

for (i=0; i<100; i++) {
   for (j=0; j<100; j++) {
      A[i][j] = A_new[i][j]
   }
}

更快地涉及指针。但是,我不确定如何做到这一点。我尝试过像这样的事情

double *first = A;
double *second = A_new;
first = second;

但这并没有奏效。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您尝试的任何方法的速度取决于许多因素,例如编译器在优化此类操作时的智能,以及您正在使用的目标处理器。一些编译器使用指针生成更快的代码,而其他编译器使用数组下标生成更快的代码。找出一种方法是否比另一种方法更快的最佳方法是对它们进行编码,运行它们,并计算它们运行所需的时间。这可以使用库定时器功能完成。您还可以检查生成的汇编语言代码,以查看哪个版本生成更严格的代码。

您尝试过的方法,如下所示

double *first = A;
double *second = A_new;
first = second;

不起作用,因为语句first = second;只是将first指针设置为指向second数组的开头。实际上没有复制数组元素。

在C中,二维数组在存储器中排列,就像它是一维数组一样,每一行出现在前一行之后的存储器中。因此,一个小的优化是在单个循环中执行操作,而不是一组嵌套循环,如下所示:

double A[100][100];
double A_new[100][100];

for (i = 0; i < (100 * 100); i++) {
      A[i] = A_new[i];
}

这可能比原始版本运行得更快,因为只有一个循环和一个循环计数器,供程序跟踪。

这个的指针版本如下所示:

double A[100][100];
double A_new[100][100];
double *destination = A;
double *source = A_new;

for (i = 0; i < (100 * 100); i++) {
      *destination++ = *source++;
}

正如我前面提到的,你需要对它们进行编码并计算它们以找出哪一个运行得更快。