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

이는 포인터 액세스가 의미하는 바가 아닙니다. 그리고 타이밍에 관해서는, 당신이 귀찮게하지 않은 몇 가지 항목이 있습니다 (디버그 대 릴리스, 디 컴파일 된 asm 분석). 벤치마킹이'time' 프로세스 모니터만큼이나 단순하다면 우리는 모두 과대 선출 된 통계 학자가 될 것입니다. – WhozCraig

+0

당신이 이것을 의미한다고 생각합니다 : http://stackoverflow.com/q/26241007/2455888 – haccks

+0

'gcc'로 컴파일 할 때'-g' 플래그를 추가하십시오 .'objdump -D a.out> file', 둘다에 대해 프로그램. 각 프로그램에 대해 두 개의 다른 파일을 작성하십시오. 이제 vimdiff file1 file2를 수행하십시오. 차이점을 비교해보십시오. 그러나 차이는 없습니다. –

답변

0

동일합니다. 연산자 []는 array를 배열에 추가합니다.

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

+0

이것은 레지스터를 저장할 수있는 좋은 기회입니다. x86과 같은 머신에는 좋지만 x86-64 나 그와 비슷한 버전에서는 중요하지 않습니다. – EOF