一部の人々は、「配列の添え字によって実現できる操作はすべて、ポインターでも実行できます。一般に、ポインター バージョンの方が高速です」と述べています。
上記の結果に疑問があるので、次のテストを行います:</p>
次の記事では、コンパイラの最適化は気にしません。コンパイラーの最適化について、ポインターと配列の間の効率に影響を与える方法については、次の点に注意してください:効率: 配列とポインター
(Visual Studio 2010、デバッグ モード、最適化なし)
#include <windows.h>
#include <stdio.h>
int main()
{
int a[] = {10,20,30};
int* ap = a;
long counter;
int start_time, end_time;
int index;
start_time = GetTickCount();
for (counter = 1000000000L; counter>0; counter--)
{
*(ap+1) = 100;
}
end_time = GetTickCount();
printf("10 billion times of *ap = %d\n", end_time-start_time);
start_time = GetTickCount();
for (counter = 1000000000L; counter>0; counter--)
{
a[1] = 101;
}
end_time = GetTickCount();
printf("10 billion times of a[0] = %d\n", end_time-start_time);
return 0;
}
結果は:</p>
10 billion times of *ap = 3276
10 billion times of a[0] = 3541
ポインタは少し速いようです。しかし、逆アセンブルを比較した後、私はより深い混乱に陥りました。</p>
(Visual Studio 2010、デバッグ モード、最適化なし)
; 17 : *(ap+1) = 100;
mov eax, DWORD PTR _ap$[ebp]
mov DWORD PTR [eax+4], 100 ; 00000064H
; 25 : a[1] = 101;
mov DWORD PTR _a$[ebp+4], 101 ; 00000065H
アセンブル出力から、ポインタを介したメモリ アクセスには 2 命令、配列には 1 命令しかかかりません。
なぜ配列は少ない命令を実行するのに、ポインターよりも時間がかからないのですか?
CPUキャッシュに関連付けられていますか?それを証明するためにテスト コードを変更するにはどうすればよいですか?