2014-10-08 156 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