2014-10-08 45 views
0

一些C书作者说,通过指针访问数组值比通过数组索引更快。但这是真的吗? 这里有两个程序,我写了理解这个概念。是指针访问方法比数组索引更快吗?

main() 
{ 
    int arr[100000],*ptr,c,i; 
    ptr=arr; 
    for(i=0;i<100000;i++) 
     arr[i]=i; 
    for(i=0;i<100000;i++) 
     c = arr[i]; 
} 

main() 
{ 
    int arr[100000],*ptr,c,i; 
    ptr=arr; 
    for(i=0;i<100000;i++) 
     *(ptr+i)=i; 
    for(i=0;i<100000;i++) 
     c = *(ptr+i); 
} 

当我用time ./a.out运行这两个程序时,第二个程序需要更多时间。这意味着使用指针需要比数组索引方法更多的时间。 能否请您向我解释这是如何工作的,这些简单的程序?

+0

这不是他们指针访问的含义。关于时间安排,有几个项目你没有提及你占的比例(debug vs release,反编译的asm分析)。如果基准测试像“时间”流程监控一样简单,那么我们都是过多的统计人员。 – WhozCraig 2014-10-08 07:41:07

+0

我认为你的意思是这样的:http://stackoverflow.com/q/26241007/2455888 – haccks 2014-10-08 07:45:10

+0

用'gcc'.'objdump -D a.out> file'编译时添加'-g''标志,节目。请记住为每个程序创建两个不同的文件。现在做vimdiff file1 file2。比较差异,但我认为不会有任何区别。 – 2014-10-08 07:46:35

回答

0

这是一样的。 Operator []只是将索引添加到数组begin。

2

您的“指针访问”不是预期的,更快的方式。

你只是在做同样的事情作为索引,表达

A[i] 

相当于记得,在C

*(A + i) 

所以,你的第二个循环是刚刚手动表示数组索引,这是毫无意义的。

它应该是:

int main(void) 
{ 
    int arr[100000], *ptr, *end, c; 
    for(ptr = arr, end = arr + sizeof arr/sizeof *arr, i = 0; 
     ptr != end; ++i) 
    { 
     *ptr++ = i; 
    } 
    for(ptr = arr; ptr != end;) 
     c = *ptr++; 
    return 0; 
} 

什么的。仍然不能保证这是更快的,但至少它试图做更少的操作。

+1

+1高信度,这更符合指针加速的声明的意图。 – WhozCraig 2014-10-08 07:48:36

+0

这有一个很好的保存寄存器的机会,这对x86等机器来说很好,但对于x86-64或类似的机器来说并不重要。 – EOF 2014-10-08 08:31:16