Gcc 向量访问比矩阵访问快吗?

Gcc 向量访问比矩阵访问快吗?,gcc,compilation,g++,Gcc,Compilation,G++,我创建了一个非常简单的代码来了解向量访问是否比矩阵访问快 我尝试了三件事: 1:创建一个包含100.000.000个int元素的向量: int *matrix=(int*)malloc(sizeof(int)*100000*1000) for(long int=x;x<100000*1000;x++)matrix[x]=1; int*matrix=(int*)malloc(sizeof(int)*100000*1000) 对于(long int=x;x来说,情况2之所以最慢,是因为它还有

我创建了一个非常简单的代码来了解向量访问是否比矩阵访问快

我尝试了三件事:

1:创建一个包含100.000.000个int元素的向量:

int *matrix=(int*)malloc(sizeof(int)*100000*1000)
for(long int=x;x<100000*1000;x++)matrix[x]=1;
int*matrix=(int*)malloc(sizeof(int)*100000*1000)

对于(long int=x;x来说,情况2之所以最慢,是因为它还有一个间接层次

在案例1和案例3中,您从内存中获取所需元素。而在案例2中,您首先必须从内存中获取行/列数组的地址,然后才能从所需元素中进行获取。在现代计算机中,内存访问是最昂贵的操作(就执行而言),难怪要慢得多

1和3之间的差异正如预期的那样非常小。摆弄优化选项已经产生了差异,因此在这里,没有人能够在知道您正在使用的确切机器的情况下给您一个明确的答案。最佳(且仅合理)这里的方法是,查看生成的汇编代码。一个原因可能是,在一个版本中,循环变量很长,而在另一个版本中,循环变量不长(因此您在那里进行元素地址计算),这取决于您的cpu,这可能会产生不同

编辑:您的措辞选择得非常糟糕,因为没有矩阵内存访问。内存总是扁平的。矩阵寻址只是您放在顶部的“虚拟”寻址(可以直接像您在3中那样),也可以间接(通过使用不同的语言,如fortran)来实现)。因此,您或多或少需要区分矩阵的不同内存布局。在3中,您将矩阵作为矩阵中的一个大块,而在2中,您将其逐行/逐列存储在内存中,这有一个缺点,即它需要一个更高级别的间接寻址(但其优点是,您可以更快地执行某些操作,例如交换到行,而且对于垃圾收集器来说效果更好)。还有许多其他方法可以将矩阵存储在内存中(特别是在必须处理稀疏矩阵的情况下)

int ** matrix=(int**)malloc(sizeof(int*)*100000);
for(long int=0; x<100000;x++){
   matrix[x]=(int*)malloc(sizeof(int*)*1000);
}
for(int x=0; x<100000;x++){
   for(int y=0;y<1000;y++){
     matrix[x][y]=1;
   }
}
for(int x=0; x<100000;x++){
   for(int y=0;y<1000;y++){
     matrix[(x*1000)+y]=1;
   }
}