有人说:“任何可以通过数组下标实现的操作,也可以用指针来完成,指针版本一般会更快”。
我怀疑上面的结果,所以我做了以下测试:</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缓存相关联吗?如何修改我的测试代码来证明它?