【问题标题】:Quick way to copy elements in a 2D array在二维数组中复制元素的快速方法
【发布时间】:2015-11-10 17:06:38
【问题描述】:

我想改变

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;

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

【问题讨论】:

    标签: arrays pointers


    【解决方案1】:

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

    你试过的方法,如下图

    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];
    }
    

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

    this 的指针版本如下所示:

    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++;
    }
    

    正如我之前提到的,您需要对两者都进行编码并对它们进行计时,以找出哪个运行得更快。

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多