Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用“初始化数组”;“静态”;更改运行时?_C_Arrays_Gcc - Fatal编程技术网

C 用“初始化数组”;“静态”;更改运行时?

C 用“初始化数组”;“静态”;更改运行时?,c,arrays,gcc,C,Arrays,Gcc,我注意到,在使用O3优化编译之后,在C中初始化数组的两种不同方法似乎会导致运行时间的差异。下面是一个复制这种差异的最小(尽管毫无意义)示例: #include <stdio.h> #include <time.h> int main(void) { int i, j, k; int size=10000; int a[size]; clock_t time1 = clock(); for (i=0; i<size; i++)

我注意到,在使用O3优化编译之后,在C中初始化数组的两种不同方法似乎会导致运行时间的差异。下面是一个复制这种差异的最小(尽管毫无意义)示例:

#include <stdio.h>
#include <time.h>

int main(void) {
    int i, j, k;
    int size=10000;
    int a[size];
    clock_t time1 = clock();
    for (i=0; i<size; i++) {
        for (j=0; j<300000; j++) {
            for (k=0; k<700000; k++) {
                a[i] = j+k;
            }
        }
    }
    clock_t time2 = clock();
    double time = (double)(time2-time1)/CLOCKS_PER_SEC*1000.0;
    printf("%f\n", time);
    getchar();
    return 0;
}
#包括
#包括
内部主(空){
int i,j,k;
int size=10000;
int a[大小];
时钟时间1=时钟();

对于(i=0;i我认为这在很大程度上取决于编译器。当存在静态时,我的GCC 5.4完全删除了循环,可能是因为它可以计算出计算没有副作用(“死代码消除”)。由于某种原因,当存在VLA时,它无法做到这一点(这是缺少的优化)

作为旁注,为了可靠地度量性能,您需要防止编译器进行过多优化

void __attribute__((noinline, noclone)) benchmark(int *a, int size) {
  for (i=0; i<size; i++)
  for (j=0; j<300000; j++)
  for (k=0; k<700000; k++)
    a[i] = j+k;
}

int main(void) {
  int i, j, k;
  int size=10000;
  int a[size];
  clock_t time1 = clock();
  benchmark(a, size);
  clock_t time2 = clock();
  double time = (double)(time2-time1)/CLOCKS_PER_SEC*1000.0;
  printf("%f\n", time);
  getchar();
  return 0;
}
void\uuuuu属性(noinline,noclone))基准测试(int*a,int size){

对于(i=0;i您更改为静态,并使用了一个常量而不是您显示的VLA代码。您更改了两件事,谁知道哪件事可能会有不同?使用
-S
编译并查看程序集。@RetiredInja感谢您指出这一点。如果我使用“static int a[size];”(即,使用变量名而不是常量10000),然后我得到错误“a的存储大小不是常量”。这就是我为什么要“static int a[10000];@user3386109您能告诉我要查找什么吗?谢谢!
static
不是初始化器。谢谢,这很有帮助!